问题描述
将脚本定义为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)
}
解决方法
这几乎是一本教科书中关于界面的用法。
-
定义一个名为
IUsableItem
的接口,并在其中声明UseItem
:// IUsableItem.cs using UnityEngine; interface IUsableItem { void UseItem(Gameobject obj); }
-
然后,让您的每个项目实现
UseItem
,并实现IUsableItem
接口。例如,您可能有Book
和Bread
类,它们可能看起来像这样:class Book : MonoBehaviour,IUsableItem { // ... void UseItem(Gameobject obj) { // ... } // ... }
class Bread : Food,IUsableItem // Food is a MonoBehaviour { // ... void UseItem(Gameobject obj) { // ... } // ... }
-
然后在
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) }