c# - transform.forward 仅适用于 0,0,0 旋转,我想让它独立于旋转
问题描述
我有一个Camera
脚本,它跟随坦克,并将一个空GameObject
名称作为目标,我从相机到目标分配新的位置,坦克只看这个目标GameObject
,如果Camera
在 0,0,0,旋转,工作正常,但是如果我从检查员那里改变了它的旋转让说 0,145,0.. 那么它不能正常工作,目标GameObject
不知道哪个位置,这是我的代码到目前为止
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Camera : MonoBehaviour
{
public Transform tank;
private Transform target;
public float distance = 5.0f;
public float xSpeed = 250.0f;
public float ySpeed = 120.0f;
public float yMinLimit = -20.0f;
public float yMaxLimit = 80.0f;
private float x;
private float y;
public float heightOffset = 0;
void Awake()
{
Vector3 angles = transform.eulerAngles;
x = angles.x;
y = angles.y;
GameObject newTarget = new GameObject("target");
target = newTarget.transform;
FindObjectOfType<TankGunController>().target = target;
}
void LateUpdate()
{
if (tank != null)
{
x += (float)(Input.GetAxis ("Mouse X") * xSpeed * 0.02f);
y -= (float)(Input.GetAxis ("Mouse Y") * ySpeed * 0.02f);
y = ClampAngle (y, yMinLimit, yMaxLimit);
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 position = rotation * (new Vector3 (0.0f, heightOffset, -distance)) + tank.position;
transform.rotation = rotation;
transform.position = position;
target.position = transform.position + (transform.forward * 100);
}
}
private float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
{
angle += 360;
}
if (angle > 360)
{
angle -= 360;
}
return Mathf.Clamp (angle, min, max);
}
}
解决方案
transform.forward总是“在变换的正向” - 是的,它考虑了旋转,这在大多数情况下非常有用。
如果您不想这样,请改用Vector3.forward - 这是一个全局不变的方向。
此外,在 Update 和 LateUpdate 中使用“Time.deltaTime”作为一个因素(但不是 FixedUpdate) - 帧需要不同数量的 ms 才能完成,这取决于游戏状态,也取决于 pc。
使用:
transform.position += Vector3.forward * 1000 * Time.deltaTime;
与以下相比,将独立于帧速率并且整体运行更流畅:
transform.position += Vector3.forward * 100;
编辑:如果你随着时间的推移增加一些东西,我写的内容很有用。我刚刚意识到您没有添加like position = position + X
(类似于position += X
),而是实际上为目标分配了一个偏移量。抱歉,在这种情况下忽略 deltaTime。
采用
target.position = transform.position + (Vector3.forward * 100);
如果它是“向左”而不是“向前”,则使用另一个轴,例如 Vector3.right - 这些是全局方向,但它当然取决于您的相机视图。
推荐阅读
- scala - 如何管理函数式编程中的状态层次结构?
- http-headers - `content-security-policy: default-src https:;` 以内联 1:1 阻止资源加载
- reactjs - 在浏览器中获取 refresh_token 时遇到问题。无法读取 XML 响应
- c# - 将 IntPtr 作为函数的参数传递会导致内存泄漏吗?
- racket - 如何“要求”没有#lang 标题行的 Racket 模块?
- windbg - 是否可以在 windbg 中调用 win32 调用?
- swift - 以自定义尺寸阅读图库视频
- mysql - 无法使用容器密码使用 mysql 不起作用
- mongodb - Robo3T 不显示数据库
- javascript - 将多个textarea的值添加到另一个textarea提交