明天实现的内容:
退出起飞动画
起飞产生在跳跃之后,所以网络游戏角色起飞动画要紧接着跳跃动画播放,动画机如下。
这两条Transition都has exit time,并且jump到fall的优先级高于jump到ground,因为目前为止这两个转换都没有条件。
在图示地位调整优先级。
落地检测的实现及相干动画使用
要实现落地检测,须要应用Physics.Overlap里的货色,应用Physics.Overlap能够找到某个形态范畴内有重合的所有碰撞体。比方咱们要用到的Physics.OverlapCapsule就是在一个给定的胶囊体内失去所有与胶囊体有重合的特定layer的碰撞体,Overlap只能失去有哪些碰撞体重合,而不晓得其它信息(先后,远近等等)。
咱们新建落地检测器脚本OnGroundSensor,挂载到PlayerController游戏对象的子物体sensor下,sensor对象将专门因为各种检测器的挂载。
OnGroundSensor代码如下。通过SendMessage来通知PlayerController以后是否正在高空。
using System.Collections;using System.Collections.Generic;using UnityEngine;// 落地检测器public class OnGroundSensor : MonoBehaviour{ // 用于援用PlayerController游戏对象上的CapsuleCollider public CapsuleCollider capCol; // 用于绘制胶囊检测器的两个点 private Vector3 point1; private Vector3 point2; // 用于绘制胶囊检测器的半径 private float radius; void Awake() { radius = capCol.radius; } void FixedUpdate() { // 更新检测器的地位 point1 = transform.position + transform.up * radius; point2 = transform.position + transform.up * (capCol.height - radius); // 检测高空碰撞 Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius, LayerMask.GetMask("Ground")); // 判断是否撞到高空 并向父物体发送对应音讯 if(outputCols.Length != 0) { // 在高空 SendMessageUpwards("IsGround"); } else { // 不在高空 SendMessageUpwards("IsNotGround"); } }}
接下来要做的就是,在PlayerController中实现音讯接管。
// 在高空时执行的办法 通过OnGroundSensor中的SendMessage调用 public void IsGround() { m_anim.SetBool("isGround", true); } // 不在高空时执行的办法 通过OnGroundSensor中的SendMessage调用 public void IsNotGround() { m_anim.SetBool("isGround", false); }
在动画机中增加新参数isGround,用于PlayerController进行管制。
好的,当初调回先前的jump转换优先级,将jump到ground和fall到ground的转换条件设置为isGround为true。
到目前为止,落地检测的实现及相干动画使用根本实现。
落地检测器优化
倡议改小检测器的半径以及略微将检测器向下挪动一点。来失去更好的检测后果。
// 检测器偏移量 public float offset = 0.1f; void Awake() { m_radius = capCol.radius * 0.6f; } void FixedUpdate() { // 更新检测器的地位 m_point1 = transform.position + transform.up * (m_radius - offset); m_point2 = transform.position + transform.up * (capCol.height - m_radius - offset); // ... }
失足掉落
因为咱们的掉落动画只有在跳跃的前提下能力触发,所以特此退出失足掉落的设置。这样一来,只有来到高空就会播放,而不是来到高空仍旧和在高空没有两样(在没有跳起来来到高空的状况下)。是的,咱们在没有起跳的状况下来到高空和在高空没有区别,仍然能够失常操作。
首先是动画机的设置,间接拉一条transition从ground到fall就行,条件为isGround为false。
接下来,在掉落时要和跳跃一样锁死操作。当初就当一次笨蛋,在进入fall状态时发送音讯给PlayerController(更好的办法是在来到ground时发送音讯,这样还能够省掉进入跳跃时发送音讯这个操作)。
// 进入掉落时执行的办法 通过PlayerController动画机中的fall节点上挂载的FSMOnEnter中的SendMessage调用 public void OnFallEnter() { // 敞开输出并且锁定立体挪动 DisableInput_LockPlanar(); } // 敞开输出并且锁定立体挪动 private void DisableInput_LockPlanar() { // 敞开输出模块 pi.inputEnabled = false; // 锁死平台挪动计算 m_lockPlanar = true; }
动画的优化及改良
除了jump到fall,其它所有的transition都不要勾选has exit time,这样能带来更晦涩的动画成果。