如何在 Unity 中获取对随机生成的子游戏对象脚本的引用?



我在游戏中做一个商店。我在商店里有3个基座,每次你开始游戏时,商店都会从放置在每个基座上的物品池中随机生成三个不同的物品。这些物品将是每个基座上的子游戏对象。

我正在尝试引用孩子的脚本,这样我就可以从中调用一个方法,将项目的效果应用于玩家。但是,我不确定如何引用这个脚本组件。我可以使用transform.GetChild(0).gameObject成功引用子游戏对象,但我不确定如何访问子游戏的脚本组件,因为每个子游戏都有自己独特的脚本和独特的效果。

这是我的父母GameObject的脚本:

public GameObject item;
void Start()
{
item = transform.GetChild(0).gameObject;
}   
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
BuyItem();
}
}  
void BuyItem()
{
Destroy(item);
// call "ApplyItem()" from child gameobject's script

}

儿童游戏对象脚本:

public void ApplyItem()
{
player.fireRate -= 0.1f;
player.bulletSpeed += 50;
}

我会考虑使用接口,我尽量避免使用抽象类来支持它们。

我相信在交互组件之间建立接口通常也是一种很好的做法。

(从Unity 5开始,您可以通过GetComponent功能获得接口(

以下是经过轻微修改的基座脚本:

public class Pedestal : MonoBehaviour
{
public IShopItem Item;
private GameObject _itemGameObject;
private void Start()
{
_itemGameObject = transform.GetChild(0).gameObject;
Item = _itemGameObject.GetComponent<IShopItem>();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
BuyItem();
}
}
private void BuyItem()
{
Destroy(_itemGameObject);
Item.ApplyItem();
}
}

IShopItem接口:

public interface IShopItem
{
public void ApplyItem();
}

最后是要附加到项目的脚本:

public class SwordOfDoom : MonoBehaviour, IShopItem
{
public void ApplyItem()
{
// Do thingy with player
}
}

您还可以使用GetComponentInChildren((直接访问脚本。这将向您返回"0"的第一个元素;YourScriptName"从子级和以后,您可以调用GetComponentInChildren((.ApplyItem((

因此您可以通过以下方式获得GameObject:

GameObject item = transform.GetChild(0).gameObject;

类似地,您可以使用GetComponent 获得任何其他组件

YourScriptType itemScript = transform.GetChild(0).gameObject.GetComponent<YourScriptType>();

然后呼叫

itemScript.ApplyItem();

编辑:好吧,所以你的脚本是不同的,你需要通过OOP功能(如抽象类或接口(来访问它。例如,创建一个抽象脚本:

public abstract class AbstractCustomObject : MonoBehaviour{}

然后创建您的自定义对象类,从中派生:

public class CustomObject1 : AbstractCustomObject{}
public class CustomObject2 : AbstractCustomObject{}
public class CustomObject3 : AbstractCustomObject{}

然后在脚本中调用

transform.GetChild(0).gameObject.GetComponent<AbstractCustomObject>();

请记住,这种解决方案可能不是这样的,因为应该有更好的方法来设计系统(通常情况下,每个对象都有单独的脚本(。

最新更新