OnTriggerEnter或OnCollisionEnter时实例化和Fire对象

时间:2017-06-02 10:37:46

标签: c# unity3d instantiation

我想从敌人身上射出一颗子弹,从我的玩家盾牌上弹回来。

我已经建立了我的角色,敌人每隔一段时间向我射击。 然后我可以激活我的玩家盾牌(打开BoxCollider)并按下按钮。

因此,当子弹(IsTrigger)与我的玩家盾(IsNotTrigger)发生碰撞时,我想移除这个子弹然后从盾牌中向敌人的方向实例化一个新的子弹。 我也有一个破坏子弹的问题。

当OnTriggerEvent或OnColliderEvent发生时(两者都尝试过),我的Shield会出现数百个子弹。我怎么只允许向敌人开出一颗子弹呢?

以下是我的脚本的一部分,该脚本位于我的Players Shield的GameObject中。 理想情况下,一旦它与物体碰撞,我想摧毁它。

void OnTriggerEnter(Collider col) {
    if (col.tag == "Weapon") {

        attack();
    }
}

private void attack() {

    if (!GameManager.instance.GameOver) {

    bulletReturnClone = Instantiate(bulletReturn, transform.position, transform.rotation) as GameObject;
    bulletReturnClone.GetComponent<Rigidbody>().velocity = transform.forward * 25f;

2 个答案:

答案 0 :(得分:1)

我不确定你为什么要以新的速度消灭和重生子弹?

根据盾牌的几何形状,您可以查找恢复系数,从而将子弹的动能反映为真实的速度。

请注意,数学的复杂性将与盾牌几何的复杂程度成正比,具体取决于不同的碰撞原语。

  • 球体球
  • 球体平面
  • 球形地形(地形可能代表任何不均匀的表面)

或者你是否试图以某种方式收集子弹&#34;充电&#34;机械师在不同的时间释放他们?

答案 1 :(得分:1)

斯特拉坎,

我不会如何处理这个问题,但我会坚持你想要的解决方案然后分享一些改进的想法。

void OnTriggerEnter(Collider col) {
if (col.tag == "Weapon") {

    attack(col);
    }
}

private void attack(Collider col) {

if (!GameManager.instance.GameOver) {

bulletReturnClone = Instantiate(bulletReturn,  transform.position, transform.rotation) as GameObject;
bulletReturnClone.GetComponent<Rigidbody>().velocity = transform.forward * 25f;
// the following line of code should remove the bullet from the shield collider in order to prevent any future problems like spawning multiple bullets or instantly destroying the newly created bullet
bulletReturnClone.GetComponent<Transform>().position *= bulletReturnClone.GetComponent<Rigidbody>().velocity; 
Destroy(col.gameObject);
    }
}

如果你的触发器(子弹)被标记为武器,那么这个代码应该达到你的目的,即通过摧毁子弹并实例化一个新子弹并修改它的速度来反射你指向盾牌方向的子弹。它有效,但它是一种草率的发展。如果从不同的角度处理问题可能会好得多 - 一个是子弹而不是盾牌。

让我们假装你是一个子弹。你所做的就是向你射击的方向飞翔。一旦与地形发生碰撞,就会停止/消失。如果这个地形是一个盾牌你不会停止/消失,但改变你的方向(你会被反映)。   所以...长话短说......应该有一个触发器对撞机的人是子弹而不是盾牌。子弹脚本的OnTriggerEnter(Collider col)会破坏它但是如果col.tag ==&#34; Shield&#34;子弹只会在没有所有无用的实例化和转换的情况下改变方向。 我懒得编写第二个解决方案的代码。如果你明白我的意思,你应该能够轻松地把它写下来。通过试验和错误学习有助于你发展(借口让我变得懒惰)。