Unity2D 小行星风格游戏

Posted

技术标签:

【中文标题】Unity2D 小行星风格游戏【英文标题】:Unity2D Asteroids style game 【发布时间】:2014-02-10 15:50:35 【问题描述】:

我正在尝试在 Unity 中构建一个小行星风格的游戏,并且确实需要一些帮助。我相信就船舶运动而言,我所有的数学都是正确的,但我无法让它在 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));

    

【问题讨论】:

【参考方案1】:

按你现在的方式设置位置通常是个坏主意,因为你实际上并没有使用任何物理。你这样做的方式,velocity 是船的新位置,而不是速度。一旦你松开按键,它就会停止计算新的位置,从而停止移动。

有几个替代方案可以获得更好的结果:

1) 一种方法是调用:transform.Translate(Vector3.forward * speed * Time.deltaTime)Vector3.forward 应该对应于您认为“前进”的方向,但如果不是,您可以将其更改为任何可行的方向(例如 Vector3.up) .这意味着您只需要计算一个速度,然后让 Unity 解决剩下的问题。

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);

【讨论】:

以上是关于Unity2D 小行星风格游戏的主要内容,如果未能解决你的问题,请参考以下文章

unity2d游戏开发系列教程:四一个2D游戏所需要的主要功能(游戏框架)

Unity2D游戏物理引擎演示

unity2d像素游戏镜头运动就糊

Unity2D:缩放游戏对象而不缩放其子对象

unity2d游戏开发系列教程:三场景布置,增加怪物和机关

Unity 2d 中的碰撞检测