NO.3——在Unity3D中实现摄像机跟随的三种方法

       在设计第一人称射击游戏以及RPG游戏时,往往需要在主角身上或者近邻位置设置一个摄像机,使其能够跟随主角的移动,提升游戏体验,这里介绍三种实现摄像机跟随的方法。

       (一)固定摄像机方法,常用于RPG游戏


第一种方法,在Unity的坐标系中,我将摄像机固定在主角头部上边靠后位置,这样,主角在移动过程中,摄像机也随着移动,最后在游戏场景中大概是这个样子:


        也就是说,摄像机相对于主角,总是在Vector3.forward方向上靠后一些,在Vector3.up方向上偏上一些。同时为了使摄像机的移动更加平滑,避免掉帧现象,引入差值函数Vector3.Lerp(),使摄像机的移动更加圆润。

         相关代码如下:

using UnityEngine;
using System.Collections;

/// <summary>
/// Third person camera.
/// </summary>
public class TheThirdPersonCamera : MonoBehaviour
{
	public float distanceAway=1.7f;			
	public float distanceUp=1.3f;			
	public float smooth=2f;				// how smooth the camera movement is
		
	private Vector3 m_TargetPosition;		// the position the camera is trying to be in)
	
	Transform follow;        //the position of Player
	
	void Start(){
		follow = GameObject.FindWithTag ("Player").transform;	
	}
	
	void LateUpdate ()
	{
		// setting the target position to be the correct offset from the 
		m_TargetPosition = follow.position + Vector3.up * distanceUp - follow.forward * distanceAway;
		
		// making a smooth transition between it's current position and the position it wants to be in
		transform.position = Vector3.Lerp(transform.position, m_TargetPosition, Time.deltaTime * smooth);
		
		// make sure the camera is looking the right way!
		transform.LookAt(follow);
	}
}

     (二)摄像机替代主角方法,常用于第一人称射击

       如图所示,直接用摄像机替代主角视角,摄像机看到的便是玩家在游戏场景中看到的。首先在Hierachy视图中建立空物体作为Player,使其旋转方向与摄像机保持一致。


        相关代码如下:

// 摄像机Transform
    Transform m_camTransform;

    // 摄像机旋转角度
    Vector3 m_camRot;

    // 摄像机高度(即表示主角的身高)
    float m_camHeight = 1.4f;
 void Start () {

        m_transform = this.transform;
        
         
        // 获取摄像机
        m_camTransform = Camera.main.transform;

        // 设置摄像机初始位置
        m_camTransform.position = m_transform.TransformPoint(0, m_camHeight, 0);    //摄像机初始位置从本地坐标转化成世界坐标,且在X-Z平面的初始位置

        // 设置摄像机的旋转方向与主角一致
        m_camTransform.rotation = m_transform.rotation;  //rotation为物体在世界坐标中的旋转角度,用Quaternion赋值
        m_camRot = m_camTransform.eulerAngles;    //在本游戏实例中用欧拉角表示旋转
        }

void Control()
    {

        //获取鼠标移动距离
        float rh = Input.GetAxis("Mouse X");
        float rv = Input.GetAxis("Mouse Y");

        // 旋转摄像机
        m_camRot.x -= rv;
        m_camRot.y += rh;
        m_camTransform.eulerAngles = m_camRot;   //通过改变XYZ轴的旋转改变欧拉角

        // 使主角的面向方向与摄像机一致
        Vector3 camrot = m_camTransform.eulerAngles;
        camrot.x = 0; camrot.z = 0;
        m_transform.eulerAngles = camrot;
    }

      (三)类似于第一种方法

此方法在学习制作一款坦克大战时用到,原理其实和第一种方法类似,只不过用到了正余弦函数。



    相关代码如下:

 public float distance = 8;
    //横向角度
    public float rot = 0;    //用弧度表示
    //纵向角度
    private float roll = 30f * Mathf.PI * 2 / 360;    //弧度
    //目标物体
    private GameObject target;
 void Start()
    {
        //找到坦克
        target = GameObject.Find("Tank");
        
    }
 
 
void LateUpdate() 
    {
        //一些判断
        if (target == null)
            return;
        if (Camera.main == null)
            return;
        //目标的坐标
        Vector3 targetPos = target.transform.position;
        //用三角函数计算相机位置
        Vector3 cameraPos;
        float d = distance *Mathf.Cos (roll);
        float height = distance * Mathf.Sin(roll);
        cameraPos.x = targetPos.x +d * Mathf.Cos(rot);
        cameraPos.z = targetPos.z + d * Mathf.Sin(rot);
        cameraPos.y = targetPos.y + height;
        Camera.main.transform.position = cameraPos;
        //对准目标
        Camera.main.transform.LookAt(target.transform);
     }








猜你喜欢

转载自blog.csdn.net/ghl1390490928/article/details/80139439