统一将脚本定义为MonoBehaviour变量时如何访问脚本函数

问题描述

将脚本定义为MonoBehavIoUr变量时如何访问脚本函数... (请参见下面的大示例代码) unity可以识别脚本并将其附加到目前为止。 但是如何使用它的功能...呢?

VariableItemSkript. ?????.UseItem(UserObj);   // <======== how do i access the script

我知道这可行...:

gameObject.GetComponent<ScriptNameHere>().UseItem(UserObj); 

但是我有300多个项目脚本 而且我不想每次生成新项目时都引用表...

using UnityEngine;

public class Items : MonoBehavIoUr
{
    //(unrelated variables)
    public MonoBehavIoUr VariableItemSkript;
    public GameObject UserObj; // set by inventory or NPC pickup Event. 

    public void Start()
    {
        // =================================================================================== // gets the item script on the item automatically
        var Skripts = GetComponents(typeof(MonoBehavIoUr)); // get all scripts on current object.
        foreach (MonoBehavIoUr Skript in Skripts)           //for each of them.
        {
            if (Skript != GetComponent<Item>())             //exclude the "item" handle (this) Script.
            {
                print(Skript.ToString());
                VariableItemSkript = Skript;  //set the script object so we can access it.
            }
        }
    }
    public void ItemUsage(GameObject UserObj) // triggered by active item use event (inventory or NPC use event)
    {
        if (VariableItemSkript != null)
        {
            VariableItemSkript. ?????.UseItem(UserObj);   // <======== how do i access the script
        }
        else Debug.Log("no item"); // it dosnt logg so it sees the item
    }
    //(unrelated 400+ lines of code)
}

解决方法

这几乎是一本教科书中关于界面的用法。

  1. 定义一个名为IUsableItem的接口,并在其中声明UseItem

    // IUsableItem.cs
    using UnityEngine;
    
    interface IUsableItem
    {
        void UseItem(Gameobject obj);
    }
    
  2. 然后,让您的每个项目实现UseItem,并实现IUsableItem接口。例如,您可能有BookBread类,它们可能看起来像这样:

    class Book : MonoBehaviour,IUsableItem
    {
        // ...
        void UseItem(Gameobject obj)
        {
            // ...
        }
        // ...    
    }
    
    class Bread : Food,IUsableItem // Food is a MonoBehaviour
    { 
        // ...
        void UseItem(Gameobject obj)
        {
            // ...
        }
        // ...
    }
    
  3. 然后在Items中,您可以将其称为IUsableItem而不是MonoBehaviour(字段和局部变量名称通常以小写字母开头,因此我进行了更改他们相应地):

    using UnityEngine;
    
    public class Items : MonoBehaviour
    {
        //(unrelated variables)
        public IUsableItem variableItemSkript;
        public GameObject userObj; // set by inventory or NPC pickup Event. 
    
        public void Start()
        {
            // gets the item script on the item automatically
            variableItemSkript = GetComponent<IUsableItem>();
            if (variableItemSkript != null) 
            {
                print(variableItemSkript.ToString());
            }
        }
    
        public void ItemUsage(GameObject UserObj) // triggered by active item use event (inventory or NPC use event)
        {
            if (variableItemSkript != null)
            {
                variableItemSkript.UseItem(UserObj);
            }
            else Debug.Log("no item"); // it dosnt logg so it sees the item
        }
        //(unrelated 400+ lines of code)
    }