1.新增翻滚状态
很简单,添加一个roll动画,设置一个触发条件roll,
当速度为0时会从fall到roll,并添加条件isground,消勾HET,但从roll到ground不能消勾,因为要播放完roll动画。这里调节了roll动画里的Y的根节点锁死到原点,这样roll会着地滚,而不是在空中了。
2.走路翻滚,跳翻滚,后跳状态
从jump到roll,jump落地速度为0,设置条件速度forward小于1.1且是isground即可,消勾HXT
从fall到roll 只要roll这个条件即可
从ground到roll只需要 有一点速度即可 设置 forward1.1,且按了jump信号
从ground 到jab 让速度forward 小于0.1相当于没速度的时候才能后跳,然后需要一个jump信号
后跳状态,你加冲量是没用的,即使你用model.transform.forward * -jabVelocity也不行
你要加一个FSMOnUpdate在Jab里,然后出来一个方法OnJabUpdate
这里的getfloat要和 jab动画里的CURVE参数对应才行,设置曲线从-3到0曲线变化,然后把旋转和 转动锁死,你会发现完美后跳了。
3.Camera Control
public PlayerInput pi;
public float horizontalSpeed= 20.0f;
public float verticalSpeed = 50.0f;
private GameObject model; //控制不让模型移动
public float cameraDampValue = 0.5f;
private GameObject playerHandle;//控制水平方向移动
private GameObject cameraHandle;//挂在脖子上
private float tempEulerX;
private GameObject camera1;
private Vector3 cameraDampVelocity;
void Awake () {
cameraHandle = transform.parent.gameObject;
playerHandle = cameraHandle.transform.parent.gameObject;
tempEulerX = 20;
model = playerHandle.GetComponent<ActorController>().model;
camera1 = Camera.main.gameObject;
}
// Update is called once per frame
void Update () {
Vector3 tempModelEuler = model.transform.eulerAngles;//让model的转向不动
playerHandle.transform.Rotate(Vector3.up, pi.Jright * horizontalSpeed * Time.deltaTime);//饶Y轴Up的水平方向转动
tempEulerX -= pi.Jup * verticalSpeed * Time.deltaTime;//竖直方向转动涉及同位角的问题,所以用减法解决,让它的角度到我们想要的角度Clamp截断
tempEulerX = Mathf.Clamp(tempEulerX, -40, 30);
cameraHandle.transform.localEulerAngles = new Vector3(tempEulerX, 0, 0);//EulerAngles不能是这个,这个是全局的转动。会影响Y方向rotate的旋转
model.transform.eulerAngles = tempModelEuler;
//camera1.transform.position = Vector3.Lerp(camera1.transform.position, transform.position,0.2f);lerp方法也可以
camera1.transform.position = Vector3.SmoothDamp(camera1.transform.position, transform.position, ref cameraDampVelocity, cameraDampValue);//SmoothDamp方法也可以。
camera1.transform.eulerAngles = transform.eulerAngles;//有转向后再动
}