摄像机俯视跟随游戏角色的实现

Posted 桫椤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了摄像机俯视跟随游戏角色的实现相关的知识,希望对你有一定的参考价值。

 1 // CameraMovement.cs
 2 using UnityEngine;
 3 using System.Collections;
 4  
 5 public class CameraMovement : MonoBehaviour
 6 {
 7     public float smooth = 1.5f;         // 摄像机跟踪速度
 8      
 9      
10     private Transform player;           // 引用角色位置
11     private Vector3 relCameraPos;       // 摄像机与角色的相对位置
12     private float relCameraPosMag;      // 摄像机到角色的距离向量长度
13     private Vector3 newPos;             // 摄像机的新位置
14  
15      
16     void Awake ()
17     {
18         // 引用角色位置
19         player = GameObject.FindGameObjectWithTag(Tags.player).transform;
20          
21         //获取摄像机与角色的相对位置
22         relCameraPos = transform.position - player.position; // 相对位置 = 摄像机位置 - 角色位置
23         relCameraPosMag = relCameraPos.magnitude - 0.5f; // 相对位置向量的长度 = 相对位置的长度 - 0.5f  防止光线投射碰撞地面
24     }
25      
26      
27     void FixedUpdate ()
28     {
29         // 摄像机初始位置 = 角色位置 + 角色与摄像机的相对位置
30         Vector3 standardPos = player.position + relCameraPos;
31          
32         // 俯视位置 = 角色位置 + 角色正上方 * 相对位置向量的长度
33         Vector3 abovePos = player.position + Vector3.up * relCameraPosMag;
34          
35         // 创建长度为5的数组 储存5个摄像机位置
36         Vector3[] checkPoints = new Vector3[5];
37          
38         // 第一个检测 摄像机标准位置
39         checkPoints[0] = standardPos;
40          
41         // 这三个检测位置为 标准位置到俯视位置之间的三个位置 插值分别为25% 50% 75%
42         checkPoints[1] = Vector3.Lerp(standardPos, abovePos, 0.25f);
43         checkPoints[2] = Vector3.Lerp(standardPos, abovePos, 0.5f);
44         checkPoints[3] = Vector3.Lerp(standardPos, abovePos, 0.75f);
45          
46         // 最后检测位置为 摄像机俯视位置
47         checkPoints[4] = abovePos;
48          
49         // 通过循环检测每个位置是否可以看到角色
50         for(int i = 0; i < checkPoints.Length; i++)
51         {
52             // 如果可以看到角色
53             if(ViewingPosCheck(checkPoints[i]))
54                 // 跳出循环
55                 break;
56         }
57          
58         // 让摄像机位置 从当前位置 平滑转至 新位置
59         transform.position = Vector3.Lerp(transform.position, newPos, smooth * Time.deltaTime);
60          
61         // 确保摄像机朝向角色方向
62         SmoothLookAt();
63     }
64      
65      
66     bool ViewingPosCheck (Vector3 checkPos)
67     {
68         RaycastHit hit;
69          
70         // 如果光线投射碰撞到某个对象
71         if(Physics.Raycast(checkPos, player.position - checkPos, out hit, relCameraPosMag))
72             // 如果光线投射碰撞点不是角色位置
73             if(hit.transform != player)
74                 // 当前检测位置不合适 返回false
75                 return false;
76          
77         // If we haven‘t hit anything or we‘ve hit the player, this is an appropriate position.如果光线投射没有碰撞到任何东西 或者碰撞点为角色位置时 更新当前检测位置为摄像机的新位置
78         newPos = checkPos;
79         return true;
80     }
81      
82      
83     void SmoothLookAt ()
84     {
85         // 创建从摄像机到角色的向量
86         Vector3 relPlayerPosition = player.position - transform.position;
87          
88         // 根据摄像机到角色的向量 创建旋转角度 
89         Quaternion lookAtRotation = Quaternion.LookRotation(relPlayerPosition, Vector3.up);
90          
91         // 让摄像机从 当前角度 平划转至创建的旋转角度
92         transform.rotation = Quaternion.Lerp(transform.rotation, lookAtRotation, smooth * Time.deltaTime);
93     }
94 }

 

以上是关于摄像机俯视跟随游戏角色的实现的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D中怎么实现摄像机环绕角色和跟随角色的切换?

unity 相机跟随物体(角色)

2D游戏摄像机跟随不出界

Unity 中简单的第三人称摄像机跟随

游戏开发实战2D游戏摄像机镜头跟随,屏幕边缘限制镜头移动(使用Cinemachine组件)

游戏开发实战2D游戏摄像机镜头跟随,屏幕边缘限制镜头移动(使用Cinemachine组件)