unity3d 4.3子弹回来了

时间:2013-12-31 00:56:14

标签: unity3d

我正在尝试构建一个2D太空射击游戏,玩家将在屏幕底部保持不变并向左和向右移动。当玩家发射子弹(射弹)时,子弹上升得很好,但它又回来了。此外,如果两颗子弹发生碰撞,它们会对碰撞做出反应。

我在这里有两个问题:

  1. 如何确保子弹不会回来? (一种方法是在几秒钟之后销毁它,但不确定这是否正确)

  2. 如何避免子弹之间的碰撞。

  3. 这是我的代码段:

    void Update () {
    if (Input.GetButtonDown("Fire1"))
     {
    
    Rigidbody2D clone = (Rigidbody2D)Instantiate(bullet, transform.position + transform.up, transform.rotation);
    clone.velocity = transform.TransformDirection(Vector3.up * 20);
     }
    }
    

    我是Unity的新手,不知何故通过查看Unity论坛来编写此代码。非常感谢任何帮助。

    由于

    更多细节: 我创建了子弹并为此对象添加了Rigidbody2D和BoxCollider2D。使子弹对象成为预制件,然后将其拖动到Player对象下。现在bullet是Player对象的子节点。将上面的脚本附加到Player对象。

1 个答案:

答案 0 :(得分:1)

回答您的直接问题:

1)我不太确定你如何设置场景或使用Unity 2D工具,但通常如果你的子弹再回来,我会假设你仍然有重力应用于刚体 - 所以make确定你没有选中。

2)使用Unity3D使对象相互交互,需要附加刚体。如果你想要你的激光器摧毁怪物#1,这是至关重要的。但是,您只需要将一个刚体附加到对象上即可获得所需的效果。我建议从你的激光器上取下刚体并将刚体连接到你想要受激光射击影响的物体(怪物#1)上。 (这应该有效,如果没有其他选项 - 使用图层并忽略这些图层上的特定对象。)

提示:

这是一些额外的事情。当你创建对象并且随着时间的推移它们飞离屏幕时它们会积聚起来。想象一下,你正处于一场大战中并且实例化了数百种激光器 - 它最终会成为性能问题。因此,请务必考虑在一定时间后销毁对象。

此外,在查看您的代码后,我无法判断对象的速度是基于其当前位置还是没有添加任何内容。我认为正在发生的事情是当你实例化一个它可能正在向上移动的对象时,但由于没有增量器,所以对象(随着它变高)会减慢,直到它处于下降的速度。例如这个

    clone.velocity = transform.TransformDirection(Vector3.up * 20);

应该这样做:

    clone.velocity += transform.TransformDirection(Vector3.up * 20);

Heres http://docs.unity3d.com/Documentation/ScriptReference/Vector3-up.html,阅读速度。问题是你需要不断施加一个恒定的前进运动,这样运动中的东西就会保持运动。如果不是重力会将其拉下来。

此外,还有一些我曾经使用的代码,它创造了一个非常酷的拍摄激光效果的东西:

public class Laser : MonoBehaviour {
    public int fireRate = 70;

    void Start(){
        InvokeRepeating("FireLaser", 0.01f, 0.009f);
        Destroy( gameObject, 2.0f );
    }

    void FireLaser(){
        transform.Translate( Vector3.up * fireRate * Time.deltaTime );  
    }
}

编辑:现在是凌晨3点,我讨厌校对。