`vector3.angle(vector3 from,vector3 to)`使用的认知

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;
            }

就是这个。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值