Unity3D中摄像机跟随方法

分类栏目:unity3d教程

234

1.第一种方法

摄像机视角锁死方法,具体做法就是事先调试好视角,然后聚焦,然后用代码事先固定视角,其代码如下:

 

/  挂载对象:主相机

// 功能:相机跟随人物

// 注意:相机只能跟随人物移动,但是如果人物转向或者做某些动作,摄像机并不跟随

using UnityEngine;

using System.Collections;

public class CameraShareScript : MonoBehaviour

{

        //摄像机于要跟随物体的距离

         Vector3 Dir;

//要跟随的物体

public  GameObject m_Player;

// Use this for initialization

void Start ()

       {

//获取到摄像机于要跟随物体之间的距离

Dir = m_Player.transform.position - transform.position;

}

 

// Update is called once per frame

void LateUpdate ()

{

//摄像机的位置

transform.position = m_Player.transform.position - Dir;

        }

}

Unity3D中摄像机跟随方法

优点:代码简单,但是不能跟随人物旋转,运动。

 

2.第二种方法:

这种方法是上种方法的优化,可以实现跟随人物移动,跟随人物旋转等基本功能,但是缺点是如果添加刚体组件,摄像机无法穿墙跟随人物,其代码如下:

//  挂载对象:主相机

// 功能:把要跟随的人物Tag修改为Player

// 注意:

using UnityEngine;

using System.Collections;

 

 

public class CameraFindPlayerScript : MonoBehaviour

{

//相机距离人物高度

float m_Height = 5f;

//相机距离人物距离

float m_Distance = 5f;

//相机跟随速度

float m_Speed = 4f;

//目标位置

Vector3 m_TargetPosition;

//要跟随的人物

Transform follow;

// Use this for initialization

void Start ()

{

// 通过Tag得到这个要跟随的人物

follow = GameObject.FindWithTag ("Player").transform;

}

 

// Update is called once per frame

//相机平滑的跟随人物移动

void LateUpdate ()

{

//得到这个目标位置

m_TargetPosition = follow.position + Vector3.up * m_Height - follow.forward * m_Distance;

//相机位置

transform.position = Vector3.Lerp (transform.position, m_TargetPosition, m_Speed * Time.deltaTime);

//相机时刻看着人物

transform.LookAt (follow);

 

 

}

}

Unity3D中摄像机跟随方法

基本实现相机时刻跟随人物移动,方便快捷。

本博客为作者亲力手敲,持续更新,如有雷同,纯属巧合

3.第三种方法

第三种方法:射线检测,保证不论主角在哪摄像机永远可以看到主角,并且把摄像机的y轴和z轴锁死,使玩家视野不晕

using UnityEngine;

using System.Collections;

/// <summary>

/// Camera move.

/// 挂载对象:摄像机

/// 作用:摄像机跟随人物

/// </summary>

public class CameraMove : MonoBehaviour

{

//摄像机的移动速度

public float moveSpeed = 3f;

//摄像机的旋转速度

public  float turnSpeed = 10f;

//定义私有玩家

private Transform m_Player;

//摄像机与玩家之间的初始偏移量

private Vector3 offset;

//射线的碰撞信息

private RaycastHit hit;

//摄像机与玩家之间的距离

private float distance;

//摄像机的观察点

private Vector3[] currentPoints;

//通过Awake拿到自身的组件

void Awake ()

{

//通过tag找到人物组件

m_Player = GameObject.FindWithTag (TagsScript.Player).transform;

//定义一个v3类型的数组,里面有5个元素

currentPoints = new Vector3[5];

}

//初始化游戏对象

void Start ()

{

//游戏开始时摄像机与玩家之间的距离

distance = Vector3.Distance (transform.position, m_Player.position);

//摄像机指向玩家

//玩家与摄像机之间的偏移量

offset = m_Player.position - transform.position;

}

 

 

//物理引擎相关的放到FixedUpdate中

//LateUpdate可以避免卡顿

void LateUpdate ()

{

//摄像机观察的第一个点

Vector3 startPosition = m_Player.position - offset;

//摄像机的最后一个点

Vector3 endPosition = m_Player.position + Vector3.up * distance;

//把摄像机的五个观察点放到数组中,并且1,2,3三个观察点使用线性插值让摄像机平滑移动Slerp

currentPoints [1] = Vector3.Slerp (startPosition, endPosition, 0.25f);

currentPoints [2] = Vector3.Slerp (startPosition, endPosition, 0.5f);

currentPoints [3] = Vector3.Slerp (startPosition, endPosition, 0.75f);

currentPoints [0] = startPosition;

currentPoints [4] = endPosition;

//定义一个变量用来存储固定帧可以看到玩家的观察点

//viewposition = currentPoints [0]

Vector3 viewposition = currentPoints [0];

//for循环遍历这些点,如果找到最合适的点就把那个当前点赋值给可以看到玩家的观察点CheckView检测某个点能否看到玩家

for (int i = 0; i < currentPoints.Length; i++) {

//如果检测到某个点可以看到玩家

if (CheckView (currentPoints [i])) {

//把这个当前点赋值给viewposition

viewposition = currentPoints [i];

//之后返回不在继续遍历

break;

}

}

//把摄像机移动到观察点

transform.position = Vector3.Lerp (transform.position, viewposition, Time.deltaTime * moveSpeed);

//调用摄像机旋转方法

SmoothRotate ();

}

/// <summary>

/// Checks the view.

/// 检测某个点是否可以看到玩家

/// </summary>

/// <returns><c>true</c>, if view was checked, <c>false</c> otherwise.</returns>

/// <param name="pos">Position.</param>

//检测某个点能否看到玩家的方法bool类型

bool CheckView (Vector3 pos)

{

//定义玩家与观察点之间的方向向量

Vector3 dir = m_Player.position - pos;

//发射射线

if (Physics.Raycast (pos, dir, out hit)) {

//如果射线打到玩家

if (hit.collider.tag == TagsScript.Player) {

//返回true

return true;

}

}

//不然返回false

return false;

}

/// <summary>

/// Smooths the rotate.

/// 摄像机旋转的方法

/// </summary>

/// 摄像机旋转的方法

void SmoothRotate ()

{

//指向起始位置

//摄像机到玩家的向量

Vector3 m_Dir = m_Player.position - transform.position;

//要旋转的角度

Quaternion qua = Quaternion.LookRotation (m_Dir);

transform.rotation = Quaternion.Lerp (transform.rotation, qua, Time.deltaTime * turnSpeed);

//把摄像机x,y轴锁死

transform.eulerAngles = new Vector3 (transform.eulerAngles.x, 0, 0);

 

}

}

Unity3D中摄像机跟随方法

此种方法的好处非常多,可以检测遮挡物,并且不论人物在哪里都可以看到人物。