我正在尝试在Unity中构建一个小行星风格的游戏,并且可以真正使用一些帮助。我相信我的所有数学运算都是正确的,但我无法让它在Unity内部工作。我有几个不同的问题。
船舶不会随着速度更新(如果你开始移动然后放手,它会静止不动)
我不确定如何将船只旋转设定到我的特定角度。
非常感谢任何帮助。
public class playerController : MonoBehaviour {
public static float timer;
public static bool timeStarted = false;
Vector2 accel;
Vector2 velocity;
float direction;
float angle;
float shotCooldown;
float speed;
const float pi = 3.141592f;
const float maxSpeed = 300;
const float maxAccel = 500;
void Start () {
timeStarted = true;
}
void Update () {
if (timeStarted == true) {
timer += Time.deltaTime;
}
shotCooldown -= (timer%60);
angle = direction * pi / 180;
if (Input.GetKey(KeyCode.W)) {
accel.y = -Mathf.Cos(angle) * maxAccel;
accel.x = Mathf.Sin(angle) * maxAccel;
velocity += accel * Time.deltaTime;
}
if (Input.GetKey(KeyCode.S)) {
accel.y = -Mathf.Cos(angle) * maxAccel;
accel.x = Mathf.Sin(angle) * maxAccel;
velocity -= accel * Time.deltaTime;
}
if (Input.GetKey(KeyCode.Space)) {
if (shotCooldown <= 0)
{
// Create new shot by instantiating a bullet with current position and angle
shotCooldown = .25f;
}
}
if (Input.GetKey(KeyCode.D)) {
direction += 360 * Time.deltaTime;
}
if (Input.GetKey(KeyCode.A)) {
direction -= 360 * Time.deltaTime;
}
/*
if (this.transform.position.x >= Screen.width && velocity.x > 0) {
this.transform.position.x = 0;
}*/
while (direction < 0) {
direction += 360;
}
while (direction > 360) {
direction -= 360;
}
speed = Mathf.Sqrt( (velocity.x * velocity.x) + (velocity.y * velocity.y));
if (speed > maxSpeed) {
Vector2 normalizedVector = velocity;
normalizedVector.x = normalizedVector.x / speed;
normalizedVector.y = normalizedVector.y / speed;
velocity = normalizedVector * maxSpeed;
}
this.transform.position = velocity * Time.deltaTime;
transform.rotation = Quaternion.AngleAxis(0, new Vector3(0,0,angle));
}
}
答案 0 :(得分:1)
以你自己的方式设置位置通常是一个坏主意,因为你实际上并没有使用任何物理。你的方式,velocity
是船的新位置,而不是速度。一旦松开键,它就会停止计算新的位置,从而停止移动。
有几种方法可以带来更好的结果:
1)这样做的一种方法是通过调用:transform.Translate(Vector3.forward * speed * Time.deltaTime)
Vector3.forward应该对应你认为是“前进”的方向,但如果没有,你可以将它改为任何有用的方法(例如Vector3。向上)。这意味着你只需要计算一个速度,让其他人团结一致。
2)如果你在船上使用刚体,你可以简单地做:
rigidbody.AddForce(Vector3.forward * speed * Time.deltaTime)
,无论你给它的速度如何,它都会在给定的方向上自动加速。
至于轮换,也许尝试这样的事情:
if (Input.GetKey(KeyCode.D))
{
Vector3 newRotation = transform.rotation.eulerAngles;
newRotation.z += 10;
transform.rotation = Quaternion.Euler (newRotation);
}
else if (Input.GetKey(KeyCode.A))
{
Vector3 newRotation = transform.rotation.eulerAngles;
newRotation.z -= 10;
transform.rotation = Quaternion.Euler (newRotation);
}