C# 在OnTriggerEnter或OnCollisionEnter时实例化并激发对象

C# 在OnTriggerEnter或OnCollisionEnter时实例化并激发对象,c#,unity3d,instantiation,C#,Unity3d,Instantiation,我想要一颗敌人发射的子弹,从我球员的盾牌上弹回来 我已经建立了我的角色,敌人每隔一段时间就会向我开火。 然后我可以激活我的玩家盾(打开BoxCollider)并按下按钮 因此,当子弹(IsTrigger)与我的玩家盾牌(IsNotTrigger)碰撞时,我想移除这颗子弹,然后从盾牌中向敌人的方向实例化一颗新子弹。 我也有一个销毁子弹的问题 当OnTriggerEvent或OnColliderEvent发生时(两者都尝试过),数百颗子弹将从我的盾牌中出现。我怎么能只让一颗子弹射向敌人 下面是我脚本

我想要一颗敌人发射的子弹,从我球员的盾牌上弹回来

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

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

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

下面是我脚本的一部分,它位于我的玩家盾的游戏对象中。 理想情况下,我想在子弹与物体碰撞后销毁它

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;
void ontriggenter(对撞机列){
如果(列标签==“武器”){
攻击();
}
}
私有无效攻击(){
如果(!GameManager.instance.GameOver){
bulletReturnClone=实例化(bulletReturn、transform.position、transform.rotation)为游戏对象;
bulletReturnClone.GetComponent().velocity=transform.forward*25f;

我真的不知道你为什么想让子弹以新的速度消失和重生

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

请注意,该数学的复杂性将与盾牌几何体的复杂性成正比,具体取决于不同的碰撞基本体

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

或者你是想用某种“充电”机制收集子弹,然后在不同的时间释放回来?

我真的不知道你为什么想让子弹以新的速度释放出来

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

请注意,该数学的复杂性将与盾牌几何体的复杂性成正比,具体取决于不同的碰撞基本体

  • 球体
  • 球面
  • 球体地形(地形可以表示任何不均匀的表面)
还是你想用某种“充电”机制收集子弹,以便在不同的时间释放回来?

Strachan

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

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);
    }
}
void ontriggenter(对撞机列){
如果(列标签==“武器”){
攻击(col);
}
}
私人无效攻击(对撞机列){
如果(!GameManager.instance.GameOver){
bulletReturnClone=实例化(bulletReturn、transform.position、transform.rotation)为游戏对象;
bulletReturnClone.GetComponent().velocity=transform.forward*25f;
//下面的代码行应该将子弹从盾牌碰撞器中移除,以防止将来出现任何问题,如产生多个子弹或立即销毁新创建的子弹
bulletReturnClone.GetComponent().position*=bulletReturnClone.GetComponent().velocity;
销毁(游戏对象列);
}
}
如果你的扳机(子弹)被标记为武器这段代码应该通过销毁子弹并实例化一个新的子弹并修改它的速度来实现你的故意目标,将子弹反射到你的盾牌指向的方向。这是可行的,但这是一种草率的开发。如果你从不同的角度来处理问题,它会更好一颗子弹不是盾牌

让我们暂时假设你是一颗子弹。你所做的就是朝着你被击中的方向飞行。一旦你与地形相撞,你就会停止/消失。如果地形是一个盾牌,你不会停止/消失,而是改变你的方向(你会被反射)。 所以…长话短说…应该有触发碰撞器的是子弹而不是盾牌。子弹脚本的OnTriggerEnter(碰撞器col)将破坏它,但如果col.tag==“shield”,子弹将只改变方向,而没有所有无用的实例化和转换。 我懒得为第二个解决方案编写代码。如果你明白我的意思,你应该能够轻松地写下来。此外,通过尝试和错误学习有助于你的发展(请原谅我懒散)。

Strachan

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

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);
    }
}
void ontriggenter(对撞机列){
如果(列标签==“武器”){
攻击(col);
}
}
私人无效攻击(对撞机列){
如果(!GameManager.instance.GameOver){
bulletReturnClone=实例化(bulletReturn、transform.position、transform.rotation)为游戏对象;
bulletReturnClone.GetComponent().velocity=transform.forward*25f;
//下面的代码行应该将子弹从盾牌碰撞器中移除,以防止将来出现任何问题,如产生多个子弹或立即销毁新创建的子弹
bulletReturnClone.GetComponent().position*=bulletReturnClone.GetComponent().velocity;
销毁(游戏对象列);
}
}
如果你的扳机(子弹)被标记为武器这段代码应该通过销毁子弹并实例化一个新的子弹并修改它的速度来实现你的故意目标,将子弹反射到你的盾牌指向的方向。这是可行的,但这是一种草率的开发。如果你从不同的角度来处理问题,它会更好一颗子弹不是盾牌

让我们暂时假设你是一颗子弹。你所做的就是朝你被击中的方向飞行。一旦你与地形相撞,你就会停止/消失。如果