3D场景构建
场景主体搭建本场景参考此淘宝商品。本项目在此模型的基础上,删掉了几个书架,增加了一个房间和一扇门。
开关门动画门的架构如下:
Door(空物体)
|----DoorPivot(空物体,位于父物体一半门宽度的地方,当作把手,包含Animator)
|----RealDoor(Cube类型物体,包含Transform,MeshRender和BoxCollider)
|----DoorTrigger1(Cube类型物体,包含Transform,BoxCollider和Script)
|----DoorTrigger2(Cube类型物体,包含Transform,BoxCollider和Script)
其中两个Trigger一内一外,挂载触发开关门动画脚本。RealDoor是门的物理真身,DoorPivot是门的转轴,转轴上挂载Animator实现开关门动画。
打开Window-Animation-Animation, 点击DoorPivot,Add Property为门的Rotation。在0:00个0:30添加两个关键帧。开门时0:00关键帧Rotation为0,0:30关键帧Rotation为85;关门时0:00关键帧Rotation为85,0:30关键帧Rotation为0。
Animator状态机如上图编写,当人站到DoorTrigger上的时候触发动画。
关键代码如下:
//DoorManager.cs
public class DoorManager:MonoBehaviour
{
private Animator _animator;
public bool IsDoorOpen()
{
return _animator.GetBool("Opened");
}
public void OpenDoor()
{
if(!IsDoorOpen())
{
_animator.SetBool("Opened",true);
}
}
public void CloseDoor()
{
if(IsDoorOpen())
{
_animator.SetBool("Opened",false);
}
}
void Awake()
{
_animator=GetComponent<Animator>();
}
}
.开关门触发
为Animator添加一个bool变量isOpen,当物体踏入trigger的时候,把isOpen设置为true,否则设置为false。当isOpen变化的时候,Animator状态转移,门的开关状态改变。
关键代码如下:
//DoorTrigger.cs
public class DoorTrigger:MonoBehaviour
{
public DoorManager doorManager;
private void OnTriggerEnter(Collider other)
{
doorManager.OpenDoor();
}
private void OnTriggerStay(Collider other)
{
doorManager.OpenDoor();
}
private void OnTriggerExit(Collider other)
{
doorManager.CloseDoor();
}
}