unity 实现宠物跟随移动

来源:互联网 发布:windows 10 显示桌面 编辑:程序博客网 时间:2024/05/03 10:40

简单的跟随移动

玩家移动控制脚本

using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayerMove : MonoBehaviour {    // Use this for initialization    void Start () {    }    // Update is called once per frame    void Update () {        float h = Input.GetAxis ("Horizontal");        float v = Input.GetAxis ("Vertical");        if(h!=0 || v!=0){            transform.LookAt (transform.position+new Vector3(h,0,v));            transform.Translate (transform.forward*Time.deltaTime*5f,Space.World);        }    }}

跟对对象移动控制脚本

using System.Collections;using System.Collections.Generic;using UnityEngine;public class PetMove : MonoBehaviour {    public Transform player;//主角    public float speed=1f;//移动的阻尼,值越小,移动越平缓    // Use this for initialization    void Start () {    }    // Update is called once per frame    void Update () {//如果主角和宠物直接的距离大于5,控制宠物跟随主角移动        if(Vector3.Distance(player.position,transform.position)>5f){            PetSmothFlow ();            //to do。。播放移动动画        }        //to do。。播放站立动画        //控制宠物的朝向        transform.LookAt (player.position);    }    //控制宠物的位置平滑移动    void PetSmothFlow(){        transform.position=Vector3.Lerp (transform.position,player.position,Time.deltaTime*speed);    }}

宠物跟随移动

玩家移动控制脚本

using UnityEngine;using System.Collections;public class PlayerMove : MonoBehaviour {    public float speed = 8f;    Animator anim;    // Use this for initialization    void Start () {        anim = this.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 || Mathf.Abs(v) > 0)        {            transform.LookAt(transform.position + new Vector3(h, 0, v));            transform.Translate(transform.forward * Time.deltaTime * speed, Space.World);            anim.SetBool("Run", true);        }        else anim.SetBool("Run",false);    }}

跟对对象移动控制脚本

using UnityEngine;using System.Collections;public class PetFlow : MonoBehaviour {    public Transform player;    public float maxDis = 5;    Animator anim;    private SmoothFollowerObj posFollow;//控制位置平滑移动    private SmoothFollowerObj lookFollow;//控制朝向平滑转换    public Vector3 positionVector;//角色位置移动的时候,方向向量    public Vector3 lookVector;//角色朝向变化的时候,朝向向量    private Vector3 lastVelocityDir;//上一次移动的方向    private Vector3 lastPos;//之前移动的目标点位置    // Use this for initialization    void Start () {        anim = this.GetComponent<Animator>();//获取动画控制器        posFollow = new SmoothFollowerObj(0.5f, 0.5f);        lookFollow = new SmoothFollowerObj(0.1f, 0.0f);        posFollow.Update(transform.position, 0, true);//初始化负值        lookFollow.Update(player.transform.position, 0, true);        positionVector = new Vector3(0, 0.5f, 1.7f);        lookVector = new Vector3(0, 0, 1.5f);        lastVelocityDir = player.transform.forward;        lastPos = player.transform.position;    }    // Update is called once per frame    void Update () {        float dis = Vector3.Distance(transform.position,player.position);        if (dis > maxDis)//如果玩家和宠物之间的距离大于允许的最大距离,控制宠物向玩家移动        {            PetMoveFlow();//宠物移动的逻辑            anim.SetBool("Run", true);        }        else {            anim.SetBool("Run",false);        }        transform.LookAt(player.position,Vector3.up);    }    private void PetMoveFlow()    {        lastVelocityDir += (player.transform.position - lastPos) * 5;        lastPos = player.transform.position;        lastVelocityDir += player.transform.forward * Time.deltaTime;        lastVelocityDir = lastVelocityDir.normalized;        Vector3 horizontal = transform.position - player.transform.position;        Vector3 horizontal2 = horizontal;        Vector3 vertical = player.transform.up;        Vector3.OrthoNormalize(ref vertical, ref horizontal2);        if (horizontal.sqrMagnitude > horizontal2.sqrMagnitude) horizontal = horizontal2;        transform.position = posFollow.Update(            player.transform.position + horizontal * Mathf.Abs(positionVector.z) + vertical * positionVector.y,            Time.deltaTime        );        horizontal = lastVelocityDir;        Vector3 look = lookFollow.Update(player.transform.position + horizontal * lookVector.z - vertical * lookVector.y, Time.deltaTime);        transform.rotation = Quaternion.FromToRotation(transform.forward, look - transform.position) * transform.rotation;    }     class SmoothFollowerObj    {        private Vector3 targetPosition;        private Vector3 position;        private Vector3 velocity;        private float smoothingTime;        private float prediction;        public SmoothFollowerObj(float smoothingTime)        {            targetPosition = Vector3.zero;            position = Vector3.zero;            velocity = Vector3.zero;            this.smoothingTime = smoothingTime;            prediction = 1;        }        public SmoothFollowerObj(float smoothingTime, float prediction)        {            targetPosition = Vector3.zero;            position = Vector3.zero;            velocity = Vector3.zero;            this.smoothingTime = smoothingTime;            this.prediction = prediction;        }        // 更新位置信息        public Vector3 Update(Vector3 targetPositionNew, float deltaTime)        {            Vector3 targetVelocity = (targetPositionNew - targetPosition) / deltaTime;//获取目标移动的方向向量            targetPosition = targetPositionNew;            float d = Mathf.Min(1, deltaTime / smoothingTime);            velocity = velocity * (1 - d) + (targetPosition + targetVelocity * prediction - position) * d;            position += velocity * Time.deltaTime;            return position;        }        //根据传递进来的数据,重置本地参数        public Vector3 Update(Vector3 targetPositionNew, float deltaTime, bool reset)        {            if (reset)            {                targetPosition = targetPositionNew;                position = targetPositionNew;                velocity = Vector3.zero;                return position;            }            return Update(targetPositionNew, deltaTime);        }        public Vector3 GetPosition() { return position; }        public Vector3 GetVelocity() { return velocity; }    }}

demo 下载:http://download.csdn.net/detail/u011484013/9724831

0 0
原创粉丝点击