Unity3D基础知识 加入小组

34个成员 32个话题 创建时间:2015-09-16

Untiy3d宠物跟随代码

发表于2017-06-16 596次查看

 Untiy3d宠物跟随代码:

     //定义一个变量来引用要跟随的对象
    public Transform TargetObj = null;

    //定义一个对象引用角色的animator组件
    protected Animator animator;

    //定义一个角色控制器变量引用角色控制器
    protected CharacterController controller;

    //定义一个时间变量,主要用在使用Animator组件设置浮点函数
    private float SpeedDempTime = 0.25f;
    private float DirectionDempTime = 0.25f;

    void Start()
    {
        //对前面定义的两个组件类型的变量animator和controller进行初始化
        animator = GetComponent<Animator>();
        controller = GetComponent<CharacterController>();
        if (animator) //当组件存在时
        {
            //对animator组件中的一个属性animator 和 speed 进行随机化设置
            //animator 和speed 的作用就是控制animator动画的播放
            animator.speed = 1 + Random.Range(-0.4f, 0.4f);
        }
    }

    // Update is called once per frame
    void Update()
    {//控制角色跟随的主要逻辑
        if (animator && TargetObj)
        {
            //是跟随者跟随的目标一起运动,同时两者之间保持一定的距离之内
            if (Vector3.Distance(TargetObj.position, animator.rootPosition) > 3)//是一个物体跟随另一个物体, 判断两个物体之间保持在硬顶的距离之内
            {
                animator.SetFloat("Speed", 1, SpeedDempTime, Time.deltaTime);
                //定义俩个矢量
                Vector3 curentDir = animator.rootRotation * Vector3.forward; // 定义角色的正方向 也就是角色的前方
                //通过计算判断两者之间的位置关系
                Vector3 wanterDir = (TargetObj.position - animator.rootPosition).normalized;

                //if else语句:判断物体和当前物体之间的位置关系,主要用到了点积和差积的矢量的操作     来进行方向的判断
                if (Vector3.Dot(curentDir, wanterDir) > 0)//当物体大于0 也就是物体的前方    
                {
                    //通过差积来判断左右
                    animator.SetFloat("Direction", Vector3.Cross(curentDir, wanterDir).y, DirectionDempTime, Time.deltaTime);
                }
                else
                {
                    animator.SetFloat("Direction", Vector3.Cross(curentDir, wanterDir).y > 0 ? 1 : -1, DirectionDempTime, Time.deltaTime);
                }
            }
            else
            {
                animator.SetFloat("Speed", 0, SpeedDempTime, Time.deltaTime);
            }
        }

    }

 

发表回复
你还没有登录,请先 登录或 注册!