c# - Unity3D:相机无法使用第一人称脚本移动
问题描述
该对象是卫星类型,因此我有一个脚本可以使用其位置在轨道上移动对象。而且我还有一个脚本可以在第一人称模式下移动卫星物体。
问题是用户无法在第一人称模式下通过轴“鼠标 X”和“鼠标 Y”移动相机。问题正在发生,因为轨道脚本和第一人称脚本都在控制相机,因此它无法移动。在游戏中,当您移动鼠标时,您会看到相机抖动,当我禁用轨道脚本时,第一人称工作。
我该如何解决这个问题?
一个解决方案可以是仅使用位置作为轨道,并使用第一人称控制的旋转??第一人称模式不会控制物体的位置,只能旋转。轨道不会控制物体的旋转位置。
谢谢!
轨道脚本
private void FixedUpdate()
{
transform.RotateAround(centerOfOrbit.position, orbitAxis, orbitSpeed * Time.deltaTime);
desiredOrbitPosition = (transform.position - centerOfOrbit.position).normalized * orbitRadius + centerOfOrbit.position;
transform.position = Vector3.MoveTowards(transform.position, desiredOrbitPosition, Time.deltaTime * orbitAdjustSpeed);
}
第一人称模式控制(不适用于 Orbit)
private void Update()
{
if(allowFirstPerson)
{
x+= Input.GetAxis ("Mouse X") * turnSpeed;
if (allowTiltingForward)
{
y -= Input.GetAxis("Mouse Y") * turnSpeed;
}
y = ClampAngle(y, minVerticalAngle, maxVerticalAngle);
if (minHorizontalAngle != 0 || maxHorizontalAngle != 0)
{
x = ClampAngle(x, minHorizontalAngle, maxHorizontalAngle);
}
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 direction = (rotation * Vector3.forward * 100);
aimPoint = new Vector3(direction.x + aimError, direction.y + aimError, direction.z + aimError);
aimDir = (aimPoint - playerCamera.transform.position).normalized;
}
}
此顶视图模式控件适用于 Orbit 脚本,但顶视图不使用与第一人称相同的控件,但我似乎无法弄清楚为什么一个有效而另一个无效。
顶视图模式控制(适用于 Orbit)
private void Update()
{
if(allowTopView)
{
Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
topDownAimPoint = new Vector3(0,0,0);
if(Physics.Raycast(ray, out hit))
{
topDownAimPoint = hit.point;
}
aimPoint = new Vector3(topDownAimPoint.x + aimError, topDownAimPoint.y + aimError, topDownAimPoint.z + aimError);
}
}
解决方案
我的理解是,您的问题是由两个脚本试图为同一对象设置旋转引起的:相机。如果是这种情况,您可以创建一个空Satellite
对象并使相机成为层次结构中该对象的子对象。将轨道脚本附加到Satellite
对象并将第一人称脚本附加到相机将允许相机在卫星的轨道上移动,但仍具有自己的独立旋转。
编辑:
要在这种情况下容纳 3d 模型,请创建一个名为(或类似名称)的空父对象SatteliteWrapper
并将 Orbit 脚本附加到该对象。然后让相机成为相机的孩子,SatteliteWrapper
并使 3d 模型成为相机的孩子。这允许模型随相机旋转。
推荐阅读
- javascript - 通过 JavaScript 检测手机的显示设置?
- java - Java:字符串格式以逗号打印双打
- c# - 在网络上的另一台计算机上更新或插入时刷新所有打开的表单上的 DataGridView
- python - 尝试按 psycopg2 中的聚合函数排序时出错
- android - 在 Woocommerce Rest API 调用中按多个属性及其属性术语过滤产品列表
- flutter - ScrollController:跳转到短列表中的条目
- javascript - 访问数组内的对象数组
- asp.net-core - 自定义验证属性确实显示不正确的错误消息 aspnet core 3
- android - SQLite 游标在升级时返回旧列
- django - 如果 django 表中不存在数据,如何引发错误消息