vector3.Angle(vector3 from,vector3 to)
这个方法的意图是求from向量与to向量之间的夹角,并且此夹角的大小为两者之间的锐角,所以,不管什么情况,这个函数返回的值都不可能大于180;
使用这个函数进行控制主角旋转时可以很简单地实现旋转到指定的位置。但是 有一个问题,在以下的代码中,这个函数求得的值,总是在预料之外抖动,如此导致了游戏物体的旋转不可控值;
using UnityEngine;
using System.Collections;
public class Player : MonoBehaviour {
//此脚本用来设计主角的行走、动画播放等
private Animator anim;
private float maxBlend = 5.6f;//最大混合度
public float moveSpeed = 6;//平滑起步速率
public float angleSpeed = 5;//旋转阻尼
// Use this for initialization
void Start() {
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update() {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
if (Mathf.Abs(h) > 0.1f || Mathf.Abs(v) > 0.1f)
{
//速度的混合要慢慢地从小变化到大,这样才会呈现出慢慢起跑的感觉,不至于显得突兀
float newSpeed= Mathf.Lerp(anim.GetFloat("Speed"), maxBlend, Time.deltaTime * moveSpeed);
anim.SetFloat("Speed", newSpeed);
//接下来控制动画的旋转
print("h:" + h);
print("v:" + v);
Vector3 taget = new Vector3(h, 0, v);
Vector3 now = transform.forward;
float angle = Vector3.Angle(now, taget);
print("angle:" + angle);
if (angle < 30)//因为这个角度总是不自觉的有一个跳动,即使目的方向与当前方向实际是处于同一个方向的,也会发生跳动,所以用此方法来屏蔽掉不必要的跳动
{
angle = 0;
}
transform.Rotate(Vector3.up * angle);
}
else
{
anim.SetFloat("Speed", 0);
}
}
}
执行结果为:
这个便是执行结果,可以发现,当只有v值变化,h值没有变化,此时要按逻辑来说,目的旋转方向与当前游戏物体的方向是一致的,求得的角度值应该为0。但事实上角度值却为0.1701,即有一个抖动值,我猜想该抖动值应该是由于角色在移动时,自身的晃动导致的,因为我勾选了applay root motion,所以动画移动的位移都会作用到transform组建中,导致了晃动。故而,我添加了一种方法来忽略这种晃动
if (angle < 30)//因为这个角度总是不自觉的有一个跳动,即使目的方向与当前方向实际是处于同一个方向的,也会发生跳动,所以用此方法来屏蔽掉不必要的跳动
{
angle = 0;
}
就是这个。