利用射线 Camora智能追随目标

来源:互联网 发布:嘀哩嘀哩下载下载软件 编辑:程序博客网 时间:2024/06/05 06:20
using UnityEngine;using System.Collections;using System.IO;using System.Reflection;//挂载在Camere上public class ExerciseScript : MonoBehaviour{public float m_TurnSpeed = 10f;//被追随的主角的Transformprivate Transform m_Player;//最合适的观察点Vector3 fitPoint;//主角与摄像机的向量差Vector3 dir;//主角到摄像机合适的距离float m_Distance;//通用移动速度float m_MoveSpeed;void Awake (){m_Player = GameObject.FindWithTag ("Player").transform;//第一次进来就拿到摄相机与主角的方向向量dir = m_Player.position - transform.position;//摄像机与主角的距离m_Distance = dir.magnitude - 0.5f;//magnitude 是取模(绝对值,只要大小)}// Use this for initializationvoid Start (){}// Update is called once per framevoid Update (){CameraFollow ();}void CameraFollow (){//第一个观察点[修复BUG:摄像机延迟跟随]Vector3 beginPoint = m_Player.position - dir;//最后一个观察点Vector3 endPoint = m_Player.position + Vector3.up * m_Distance;//观察点数组Vector3[] watchPoints = new Vector3[5];//将第一个观察点设置到数组中watchPoints [0] = beginPoint;//将第五个观察点设置到数组中watchPoints [4] = endPoint;//获取其中三个观察点watchPoints [1] = Vector3.Lerp (beginPoint, endPoint, 0.25f);watchPoints [2] = Vector3.Lerp (beginPoint, endPoint, 0.5f);watchPoints [3] = Vector3.Lerp (beginPoint, endPoint, 0.75f);//最终合适的观察点(先给一个初始位置)fitPoint = transform.position;//遍历观察点,找到合适的点(射线可以直接射到物体)foreach (Vector3 item in watchPoints) {if (CanWatchPlayer (item)){//确定合适的观察点fitPoint = item;break;//找到合适点后调出循环,节省资源.}}print (fitPoint);//将摄像机移动到合适的位置transform.position = Vector3.Lerp (transform.position, fitPoint, Time.deltaTime * m_MoveSpeed);//让摄像机平滑的看着主角SmoothLookAt ();}void SmoothLookAt (){//主角与摄像机之间的方向向量Vector3 dir = m_Player.position - transform.position;//转成四元数Quaternion qua = Quaternion.LookRotation (dir);//将摄像机平滑旋转到目标方向transform.rotation = Quaternion.Lerp (transform.rotation, qua, Time.deltaTime * m_TurnSpeed);transform.eulerAngles = new Vector3 (transform.eulerAngles.x, 0, 0);}bool CanWatchPlayer (Vector3 currentPoint){//射线碰撞检测器RaycastHit hit;//当前方向向量Vector3 currentDir = m_Player.position - currentPoint;//发射物理射线if (Physics.Raycast (currentPoint, currentDir, out hit)) {//如果射线碰撞的是主角if (hit.collider.tag == "Player") {return true;}}//其他情况一律返回falsereturn false;}}

0 0
原创粉丝点击