【问题标题】:How to reference an Instantiated object in Unity?如何在 Unity 中引用实例化对象?
【发布时间】:2020-04-26 09:49:37
【问题描述】:

我有一个武器,我想实例化一个对象(在本例中是子弹),然后等到子弹击中一个对象后,才允许该武器实例化另一个对象。

我目前正在通过在武器脚本上执行此操作:

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 是什么,因此它无法将 weaponScript 上的 launchable 变量设置为 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;
    }
}

解决方案:

我知道 Pastebin 不会永远保留脚本,所以我将把答案写在这里作为编辑:(另外,它让其他可能偶然发现的人更容易阅读)

我遵循了 Peridis 的回答,但它并没有立即起作用,所以我最终对其进行了调整并想出了这个:

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

感谢佩里迪斯的帮助!

【问题讨论】:

    标签: unity3d instantiation


    【解决方案1】:

    你可以在实例化射弹时创建一个 GameObject 类型的变量

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

    【讨论】:

    • 您的回答让我足够接近解决方案以使其正常工作,谢谢!如果没有你的帮助,我将无法弄清楚。不过,出于文档目的,我会指出,为了让它工作,我必须更改parentWeapon,以便您可以参考脚本,而不是游戏对象。所以我让parentWeapon 引用了weaponScript 而不是游戏对象。然后创建了另一个引用变量projectileScript,它引用了 Projectile 的脚本。然后我不得不在你的答案中添加一些代码,最后它看起来像这样:pastebin.com/Q4Tgrja1
    • @JhonPiper 你是对的,我专注于主要问题,通过查看你的代码,我忘记了脚本参考。我很高兴你解决了这个问题。 Fredrik Schön 编辑了我的答案,所以我相信它现在是正确的。
    • 看起来 Fredrik Schön 对答案的编辑得到了与我自己添加的相同的结果。谢谢你们!
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多