2016-01-20 57 views
1

我开始在Unity3d中制作一个简单的游戏:一个在墙上拍摄的坦克(见图片)。坦克不拍摄实例化子弹

enter image description here

一个GameObject连接到坦克的炮塔,并为此GameObject连接下面的脚本:

using UnityEngine; 
using System.Collections; 

public class Shooter : MonoBehaviour { 
    public Rigidbody bullet; 
    public float power = 1500f; 

    void Update() { 
     if (Input.GetButtonDown ("Fire1")) { 

      Rigidbody bulletRB = Instantiate (bullet, transform.position, transform.rotation) as Rigidbody; 
      Vector3 fwd = transform.TransformDirection(Vector3.forward); 
      bulletRB.AddForce(fwd*power); 
     } 
    } 
} 

当我按在FIRE1按钮子弹不射。我在bulletRB.addForce()之后放置了(测试)Debug.Log("BULLET SHOOT")。该消息显示,所以脚本达到了这一点。我的代码有什么问题?

+0

几件事情首先,你看到的场景层次的子弹?在Awake中用Debug调试一个测试脚本,看它是否真的被创建。你可以在OnDestroy中放置另一个调试来查看它是否被破坏。你正在坦克位置创造子弹,也许它正在击中某件东西并在它离开现场之前自行消灭。我会建议将一个游戏物体放在枪口的末端,并将其附着在坦克上。您可以使用它的transform.forward作为子弹方向。 – Everts

+0

在这里,因为我想看到一个坦克在墙上拍摄 – novice

+0

@fafase - 你的回答是ok.Tkx –

回答

0

根据Unity Answers上的this somewhat similar question,您应该直接实例化bullet预制/实例的GameObject,而不是其Rigidbody。然后,访问该新子弹的Rigidbody组件并添加该力量。然后

您的调整Update()方法会是什么样子:(又名炮塔的前向矢量)

void Update() { 
    if (Input.GetButtonDown ("Fire1")) { 
     GameObject newBullet = Instantiate (bullet.gameObject, transform.position, transform.rotation) as GameObject; 

     RigidBody bulletRB = newBullet.GetComponent<Rigidbody>(); 
     Vector3 fwd = transform.TransformDirection(Vector3.forward); 
     bulletRB.AddForce(fwd*power); 
    } 
} 

你可能想使用transform.forward改变的另一件事,而不是Vector3.forward(全球前矢量Vector3(0, 0, 1),这可能不符合炮塔方向)。

希望这会有所帮助!如果您有任何问题,请告诉我。

+0

我解决了这个简单的方法:我把射手脚本附加到大炮的孩子GObj。 Tkx的想法。 –

0

力只能应用于主动刚体。 如果GameObject处于非活动状态,则AddForce不起作用。

默认唤醒Rigidbody。如果力大小为零,那么刚体不会被唤醒。

上面的描述是从Unity

采取因此,我建议,以检查是否游戏对象是第一活性。

您可以通过执行测试如下:

if (newBullet.activeInHierarchy === true) 
{ 
    //active 
}else{ 
    //inactive 
}