在 OnTriggerEnter 或 OnCollisionEnter 时实例化并触发对象

Instantiate and Fire Object, when OnTriggerEnter or OnCollisionEnter

我想要一颗从敌人发射的子弹,从我的玩家护盾上弹回来。

我设置好了我的角色,敌人每隔一段时间就向我开火。 然后我可以激活我的玩家护盾(打开 BoxCollider)并按下按钮。

因此,当 Bullet (IsTrigger) 与我的 Players Shield (IsNotTrigger) 发生碰撞时,我想移除此 Bullet,然后从盾牌中朝 Enemy 的方向实例化一个新 Bullet。 我在销毁子弹时也遇到了问题。

当 OnTriggerEvent 或 OnColliderEvent 发生时(都尝试过),数百颗子弹将从我的盾牌中出现。如何只让一颗子弹射向敌人?

下面是我的脚本的一部分,它位于我的 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;

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

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

请注意,根据不同的碰撞基元,数学的复杂性将与盾牌几何体的复杂性成正比。

  • 球体
  • 球平面
  • 球形地形(地形可以表示任何不平坦的表面)

或者您是否正在尝试以某种 "charge" 机制收集子弹,然后在不同的时间将它们放回原位?

斯特拉坎,

这不是我解决问题的方式,但我会坚持您想要的解决方案,然后分享一些改进的想法。

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

如果您的扳机(子弹)被标记为武器,此代码应该通过销毁子弹并实例化新子弹并修改其速度来实现将子弹反射到盾指向的方向的故意目标。它有效,但它是一种草率的发展。如果您从不同的角度处理问题 - 子弹而不是盾牌的角度,情况会好得多。

让我们暂时假装你是一颗子弹。你所做的就是朝着你被射击的方向飞行。一旦与地形发生碰撞,您 stop/disappear。如果这个地形是一个盾牌,你不会 stop/disappear 而是改变你的方向(你会被反射)。 所以......长话短说......应该拥有触发对撞机的是子弹而不是盾牌。子弹脚本的 OnTriggerEnter(Collider col) 会破坏它,但如果 col.tag == "Shield" 子弹只会改变它的方向,而不会进行所有无用的实例化和转换。 我懒得写第二个解决方案的代码。如果你明白我的意思,你应该能够很容易地把它写下来。也通过尝试和错误学习帮助你发展(原谅我偷懒)。