unity5场景中有楼梯,先上效果图
首先我们使用了Unity自带的Navigation系统,但是我们又不想整个大场景去计算那里可以走,哪里不可以走,只是想要这个自动的楼梯行走,那么我们隐藏整个场景模型,添加楼梯的位置信息进去(上面的板是为了防止旁边的楼梯被算进去)4个方块是上下楼梯的参照点,具体可以网上搜Navigation的用法。
这时候开始计算,菜单-》window-》Navigation,调节一下,让人物正好能上和下
计算完产生了这样一个效果 ,把这些板子都删了,其他的模型都显示出来
OK,场景的设置,这样就可以了,接下来是人物的设置。
Transform _target = null;
NavMeshAgent _NMA;
void Update()
{
if(_target != null)
{
if (_NMA != null)
_NMA.SetDestination(_target.position);
}
}
public void StartClimp(Transform endTrans)
{
m_Animator.SetBool("Stairs", true);
if(_NMA == null)
_NMA = gameObject.GetComponent<NavMeshAgent>();
if(_NMA == null)
{
_NMA = gameObject.AddComponent<NavMeshAgent>();
_NMA.radius = 0.3f;
_NMA.height = 1.3f;
_NMA.speed = 0.4f;
}
_NMA.enabled = true;
_target = endTrans;
}
public void EndClimp()
{
if(_NMA != null)
{
m_Animator.SetBool("Stairs", false);
_NMA.enabled = false;
_target = null;
Destroy(_NMA);
}
}
写在人物的控制脚本中,供上下楼梯的触碰块调用 (开始位置块OnTriggerStay 结束位置块OnTriggerEnter)
void OnTriggerStay(Collider other)
{
// 当人碰到时 判断人的朝向跟方块朝向相同
if (other.gameObject.tag == "Player")
{
if (Mathf.Abs(transform.forward.z - other.transform.forward.z) < 0.05f)
{
Debug.Log(" 同向 ");
other.gameObject.GetComponent<UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter>().StartClimp(_end);
}
}
}
这样,人物平时是不计算Navigation路径的,只是碰到了上楼梯的块才进行上楼梯操作。
人物使用了Adobe Fuse CC的捏人,上传自动绑定骨骼,然后使用了Unity自带的人物的Admitor FSM