1.第一种方法摄像机视角锁死方法,具体做法就是事先调试好视角,然后聚焦,然后用代码事先固定视角,其代码如下:
/ 挂载对象:主相机// 功能:相机跟随人物// 注意:相机只能跟随人物移动,但是如果人物转向或者做某些动作,摄像机并不跟随using UnityEngine;using System.Collections;public class CameraShareScript : MonoBehaviour{ //摄像机于要跟随物体的距离 Vector3 Dir;//要跟随的物体public GameObject m_Player;// Use this for initializationvoid Start () {//获取到摄像机于要跟随物体之间的距离Dir = m_Player.transform.position - transform.position;}
// Update is called once per framevoid LateUpdate (){//摄像机的位置transform.position = m_Player.transform.position - Dir; }}
优点:代码简单,但是不能跟随人物旋转,运动。
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 initializationvoid 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);
}}
基本实现相机时刻跟随人物移动,方便快捷。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三个观察点使用线性插值让摄像机平滑移动SlerpcurrentPoints [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])) {//把这个当前点赋值给viewpositionviewposition = 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) {//返回truereturn true;}}//不然返回falsereturn 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);
}}
此种方法的好处非常多,可以检测遮挡物,并且不论人物在哪里都可以看到人物。转载于:https://www.cnblogs.com/Damon-3707/p/11325824.html
相关资源:JAVA上百实例源码以及开源项目