【问题标题】:how many times void oncollisionenter happens?void oncollisionenter 发生了多少次?
【发布时间】:2017-06-02 21:47:39
【问题描述】:

Unity 3d 中有没有办法检测碰撞发生的次数?

例如,如果3次则杀死敌人。

或者如果两次则减少 50% 的寿命。

我想用void OnCollisionEnter 函数来做到这一点..

这是我的 AI 代码和我的玩家代码:

public Transform[] Targets;
private int DestPoint = 0;
private NavMeshAgent Agent;
public Transform Player;
public Rigidbody Bullet;
public Transform Instantiator;
public float BulletSpeed;
public float fireRate;
private float nextFire = 0F;

void Start()
{
    Agent = GetComponent<NavMeshAgent> ();
    Agent.autoBraking = false;
}

void Update()
{
    if (Vector3.Distance(transform.position, Player.position) < 100)
    {
        transform.LookAt (Player);
        if (Time.time > nextFire)
        {
            nextFire = Time.time + fireRate;
            Agent.Stop ();
            Shoot ();
        }
    }
    else if (Vector3.Distance(transform.position, Player.position) > 100)
    {
        GotoNextPoint ();
    }
}

void GotoNextPoint()
{
    Agent.destination = Targets [DestPoint].position;
    DestPoint = (DestPoint + 1) % Targets.Length;
}

void Shoot()
{
    Rigidbody Clone = Instantiate (Bullet, Instantiator.position, Instantiator.rotation) as Rigidbody;
    Clone.AddForce (Instantiator.forward * Time.deltaTime * BulletSpeed);
}

public float Speed;
public float RotationSpeed;
public Rigidbody Bullet;
public float BulletSpeed;
public Transform Instantiator;
public float fireRate;
private float nextFire = 0F;

void Update()
{
    if (CrossPlatformInputManager.GetAxis("Vertical") > 0)
    {
        transform.Translate (Vector3.forward * Time.deltaTime * Speed);
    }
    if (CrossPlatformInputManager.GetAxis("Vertical") < 0)
    {
        transform.Translate (Vector3.back * Time.deltaTime * Speed);
    }
    if (CrossPlatformInputManager.GetAxis("Horizontal") > 0)
    {
        transform.Rotate (Vector3.up * Time.deltaTime * RotationSpeed);
    }
    if (CrossPlatformInputManager.GetAxis("Horizontal") < 0)
    {
        transform.Rotate (Vector3.down * Time.deltaTime * RotationSpeed);
    }

    if (CrossPlatformInputManager.GetButtonDown ("Shoot") && Time.time > nextFire)
    {
        nextFire = Time.time + fireRate;
        Rigidbody Clone = Instantiate (Bullet, Instantiator.position, Instantiator.rotation);
        Clone.AddForce (Instantiator.forward * Time.deltaTime * BulletSpeed);
    }
}

【问题讨论】:

    标签: c# unity3d collision-detection collision


    【解决方案1】:

    OnCollisionEnter 函数没有用于此的内置变量或函数。您必须为此创建一个变量,然后在每次发生碰撞时递增该变量。没有其他方法可以做到这一点。

    int collisonCounter = 0;
    
    void OnCollisionEnter(Collision collision)
    {
        //Increment Collison
        collisonCounter++;
    
        if (collisonCounter == 2)
        {
            //reduce the life by 50 percent
    
        }
    
        if (collisonCounter == 3)
        {
            // kill the enemy
    
    
            //Reset counter
            collisonCounter = 0;
        }
    }
    

    【讨论】:

    • 除非你只有一个敌人,并且唯一与玩家发生碰撞的就是敌人,否则你会希望在敌方对象本身上有这个。否则,我可能会与一个敌人发生两次碰撞,然后与另一个敌人发生一次碰撞并一发子弹。
    • @code11 当然可以,但是您可以将它放在 Player 上,然后检查它所碰撞的 GameObject 的 tag。如果您不必将该脚本附加到每个敌人,这将为您节省一些内存空间。
    • 同意,但您需要为遇到和碰撞的每个独特敌人设置一个计数器(可能在某种字典中)。
    • 我明白你现在在说什么了。它应该附着在敌人身上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多