Как ссылаться на объект в Unity? - PullRequest
1 голос
/ 26 апреля 2020

У меня есть оружие, для которого я хочу создать экземпляр объекта (в данном случае пуля), затем подождите, пока эта пуля не попадет в объект, прежде чем оружию позволят создать экземпляр другого объекта.

В настоящее время я нахожусь сделать это с помощью сценария с оружием:

public class weaponScript : MonoBehaviour
{
        public gameobject projectilePrefab;
        public bool launchable;

        void Update{
        if(launchable){
             Instantiate(projectilePrefab, firePoint.transform.position, transform.rotation);
             launchable = false;
        }
    }

и сценария с маркером:

public class projectile : MonoBehaviour
{
    void OnCollisionEnter2D(Collision2D other){
        weaponScript.launchable = true;
    }
}

Это отлично подойдет для моих нужд, однако это не сработает, потому что снаряд не имеет определения, что такое weaponScript, поэтому он не может установить для переменной launchable в weaponScript значение true.

Я мог бы использовать функцию FindObjectOdType (), и это работает, когда у вас есть одно оружие в сцене, но как только вы получаете более одного сценария оружия в сцене одновременно, у вас возникают проблемы с определением, кто есть кто.

Есть ли способ для кода оружия установить себя как переменная, когда он создает объект, таким образом, он будет выглядеть так:

public class weaponScript : MonoBehaviour
{
        public gameobject projectilePrefab;
        public bool launchable;

        void Update{
        if(launchable){
             Instantiate(projectilePrefab, firePoint.transform.position, transform.rotation);
             [InstanciatedObjectHere].parentWeapon = this.gameobject;
             launchable = false;
        }
    }

Таким образом, все, что нужно сделать снаряду:

public class projectile : MonoBehaviour
{
    void OnCollisionEnter2D(Collision2D other){
        parentWeapon.launchable = true;
    }
}

Решение:

I знать Pasteb In не сохранит сценарий навсегда, поэтому я собираюсь поместить ответ здесь в качестве правки: (плюс для некоторых других, кто может наткнуться на это, будет легче читать)

Я последовал ответу Перидиса , но это не сработало сразу, так что в итоге я настроил его и придумал:

public class weaponScript : MonoBehaviour
{
        public gameobject projectilePrefab;
        public bool launchable;
        private projectile projectileScript;

        void Update{
        if(launchable){
            GameObject projectileIntantiated = Instantiate(projectilePrefab, firePoint.transform.position, transform.rotation);
            projectileScript = projectileIntantiated.GetComponent<projectile>();
            projectileScript.parentWeapon = this.gameObject.GetComponent<weaponScript>();
            launchable = false;
        }
    }




public class projectile : MonoBehaviour
{
    public weaponScript parentWeapon;

    void OnCollisionEnter2D(Collision2D other){
        parentWeapon.launchable = true;
    }
}

Спасибо за помощь, Перидис!

1 Ответ

3 голосов
/ 26 апреля 2020

Вы можете создать переменную типа GameObject при создании экземпляра снаряда

GameObject projectileIntantiated = Instantiate(projectilePrefab, firePoint.transform.position, transform.rotation);
projectileIntantiated.GetComponent<projectile>().parentWeapon = this.gameobject;
...