我把我的主摄影机作为我的播放器对象的一个组件,但我想让它们分开,所以我创建了一个脚本,允许我的摄影机跟随我的播放器,而不是保持我的摄影机作为播放器对象的子对象。
然而,尽管我的播放器对象本身能够正确旋转,但当我水平移动鼠标时,相机并不跟随它,而只能垂直工作。
我现在有一个空的游戏对象,它连接了我的主摄像机,并引用了玩家身体(变换)和以下脚本:
public class FollowPlayer : MonoBehaviour
{
public Transform player;
public Vector3 offset;
public float mouseSensitivity = 100f;
float xRotation = 0f;
void Start()
{
Cursor.lockState = CursorLockMode.Locked;
}
void Update()
{
// Make the camera follow the player
transform.position = player.position + offset;
float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.fixedDeltaTime;
float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.fixedDeltaTime;
xRotation -= mouseY;
xRotation = Mathf.Clamp(xRotation, -90f, 90f);
transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
player.Rotate(Vector3.up * mouseX);
}
}
如果我把这个摄像机放回我的播放器对象下面,并去掉带有“偏移”的线,它就可以工作,但是如果摄像机单独工作,它就不能工作。
2条答案
按热度按时间fnvucqvd1#
我想我找到了。
代替
试试
(编辑)
以便摄影机也跟随球员的Y旋转,而不仅仅是位置。
希望这有帮助!
亚历克莎
5hcedyr02#
相机不旋转,因为你在脚本中旋转的是玩家对象,而不是相机连接的对象。而且你在脚本中没有任何关于玩家水平旋转的引用。3DartBlade在第一条评论中向你展示了如何使相机和玩家水平旋转相等[ transform.rotation = Quaternion.Euler(xRotation,player.rotation.euler.y,0 f);],但如果你有从播放器偏移,你不会得到所需的行为相机在这样的方式。最简单的方式来实现所需的行为(3D人物相机)是创建一个空对象与脚本:
并使用上一个对象的附加摄影机子对象创建您的空对象,并在其上使用下一个脚本:
然后,你应该在PlayerController脚本中实现球员绕Y轴旋转。在相机控制脚本中控制球员没有意义。当然,你可以,但它会在将来造成很大的问题。
还有几点注意事项:
1.你应该在LateUpdate()方法中移动或旋转你的相机,而不是在Update()中。因为,否则它可能会导致相机抖动。
1.不要在Update()或LateUpdate()方法中使用Time.fixedDeltaTime。它没有意义并且可能导致错误的行为。在FixedUpdate()方法中使用它-当您使用物理时。在Update()中,LateUpdate()使用Time. deltaTime。
1.对于先进和容易的相机控制-使用电影机包是最好的做法。你会松散一些时间来学习这个工具(从15分钟到一个小时),但它会使您的生活更容易在未来。