UnityUnity干货游戏开发

Unity摄像机跟随的几种方案

2017-02-23  本文已影响541人  Jens丶
我最喜欢的一个字是吃,两个字是旅行,三个字是你的名字.
Unity摊

晚上好, 接下来给大家分享摄像机的几种跟随方案.

方案1

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour
{
    //跟随目标
    public Transform mFollower;
    //相机的高度
    public float offsetY;

    //摄像机移动处理一般放在LateUpdate
    void LateUpdate ()
    {
        if (mFollower != null) {
            Vector3 targetPoint = mFollower.position;
            targetPoint.y += offsetY;
            targetPoint.z -= 7f;
            transform.position = Vector3.Lerp (transform.position, targetPoint, Time.deltaTime * 5f);
        }
    }
}

方案2

public class FollowPlayer : MonoBehaviour
{
    //玩家
    private Transform player;

    public float speed = 4.0f;

    void Start ()
    {
        player = GameObject.FindGameObjectWithTag (Tags.player).transform;  
    }

    void Update ()
    {
        //摄像机跟随
        Vector3 targetPos = player.position + new Vector3 (0, 2.0f, -2.7f);
        transform.position = Vector3.Slerp (transform.position, targetPos, speed * Time.deltaTime);
        Quaternion targetRotation = Quaternion.LookRotation (player.position - transform.position);
        transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, speed * Time.deltaTime);
    }
}

方案3

public class CameraScript : MonoBehaviour
{
        //摄像机跟离角色有多远
        public float distanceAway;
        //摄像机在角色上方多高
        public float distanceUp;
        //摄像机移动的速度
        public float smooth;
        //目标位置
        private Vector3 targetPosition;

        //摄像机所跟随的对象的位置,此处是角色物体的位置
        Transform follow;
        // Use this for initialization
        void Start ()
        {
                //得到要跟随的物体对象的位置
                follow = GameObject.FindGameObjectWithTag ("Player").transform;
        }

        // Update is called once per frame
        void Update ()
        {
                //得到摄像机要移动的目标位置
                targetPosition = follow.position + Vector3.up * distanceUp -follow.forward * distanceAway;
                //摄像机从当前位置移动到目标位置
                transform.position = Vector3.Lerp (transform.position, targetPosition, Time.deltaTime * smooth);
                //摄像机要看向角色物体
                transform.LookAt (follow);
        }
}

方案4

摄像机随鼠标旋转并且限制角度
public class CubeScript : MonoBehaviour
{
     float ver;
     // 限制角度
     float fv = 20;

     Quaternion last;

     void Update ()
     {
          ver = Input.GetAxis ("Mouse Y");    

          float angle = Vector3.Angle (Vector3.up, transform.forward);

          if (angle > 90 + fv || angle < 90 - fv) {
               transform.rotation = last;
          } else {
               last = transform.rotation;
               Vector3 tmp = new Vector3 (transform.eulerAngles.x - ver * Time.deltaTime * 60f,
                                  transform.eulerAngles.y,
                                  transform.eulerAngles.z);
               transform.eulerAngles = tmp;
          }
     }
}

代码比较简单不在解释, 如有疑问请留言.
另外再分享一个
[仿魔兽世界视角的Demo](https://pan.baidu.com/s/1jI2YI14)
密码: jt9s

上一篇 下一篇

猜你喜欢

热点阅读