您现在的位置是:首页 >技术教程 >Unity中从一个monobehaviour脚本中访问另一个monovehaviour脚本中的变量或方法网站首页技术教程

Unity中从一个monobehaviour脚本中访问另一个monovehaviour脚本中的变量或方法

dzj2021 2023-05-20 12:00:02
简介Unity中从一个monobehaviour脚本中访问另一个monovehaviour脚本中的变量或方法

Unity中从一个monobehaviour脚本中访问另一个monovehaviour脚本中的变量或方法,关键在于如何取得脚本的引用或者变量及方法的引用。

一、寻找到物体,再获取脚本组件,取得脚本的引用

通过 GameObject.Find() 方法获取脚本2 所在的 GameObject,然后通过 GetComponent() 方法获取脚本2 的实例。

// 获取脚本2 所在的 GameObject
GameObject obj = GameObject.Find("脚本2所在的GameObject的名称");

// 获取脚本2 的实例
Script2 script2 = obj.GetComponent<Script2>();

// 访问脚本2 的变量
script2.variableName;

// 调用脚本2 的方法
script2.MethodName();

二、直接定义一个脚本的示例,在观察面板上直接赋值,获得脚本的引用

在脚本1 中声明一个 public 的变量,然后在 Inspector 窗口中将脚本2 拖拽到该变量上。这样就可以在脚本1 中直接访问脚本2 的公共变量和方法。

// 在脚本1 中声明一个 public 变量
public Script2 script2;

// 在 Inspector 窗口中将脚本2 拖拽到该变量上

// 访问脚本2 的变量
script2.variableName;

// 调用脚本2 的方法
script2.MethodName();

三、用消息实现

在 Unity 中,可以使用消息系统来实现脚本之间的通信。消息系统是一种松散耦合的方式,通过发送消息来调用其他脚本中的方法,而不需要直接引用其他脚本的实例。

以下是使用消息系统实现脚本之间通信的步骤:
1、在需要接收消息的脚本中添加一个方法,该方法需要加上 [SerializeField] 和 [HideInInspector] 标签,并使用 UnityEvent 类型定义一个事件,例如:

using UnityEngine;
using UnityEngine.Events;

public class ReceiverScript : MonoBehaviour
{
    [SerializeField]
    [HideInInspector]
    public UnityEvent messageEvent;

    public void OnMessageReceived()
    {
        // 在这里编写处理消息的代码
    }
}

2、在需要发送消息的脚本中,使用 SendMessage() 或 SendMessageUpwards() 方法来发送消息,例如:

using UnityEngine;

public class SenderScript : MonoBehaviour
{
    public void SendMessageToReceiver()
    {
        GameObject receiver = GameObject.Find("Receiver");
        receiver.SendMessage("OnMessageReceived");
    }
}

3、在消息接收脚本的 GameObject 上添加一个接收器组件,例如:

using UnityEngine;

public class ReceiverScript : MonoBehaviour
{
    [SerializeField]
    [HideInInspector]
    public UnityEvent messageEvent;

    private void OnEnable()
    {
        messageEvent.AddListener(OnMessageReceived);
    }

    private void OnDisable()
    {
        messageEvent.RemoveListener(OnMessageReceived);
    }

    public void OnMessageReceived()
    {
        // 在这里编写处理消息的代码
    }
}

在这个例子中,我们在接收器脚本中添加了一个事件(messageEvent),然后在 OnEnable() 方法中添加了一个事件监听器,当该 GameObject 启用时,将调用 OnMessageReceived() 方法。在 OnDisable() 方法中,我们从事件中移除了事件监听器,以确保在 GameObject 禁用时不会调用该方法。

然后,我们在发送器脚本中使用 SendMessage() 方法来发送消息。SendMessage() 方法会在接收器 GameObject 中查找名为 “OnMessageReceived” 的方法,并调用它。

这就是使用消息系统在 Unity 中实现脚本之间通信的方式。使用消息系统可以减少代码的耦合度,让脚本之间更加灵活地协作。

四、用单例来实现

在 Unity 中,可以使用单例模式来实现脚本之间的通信。单例模式是一种设计模式,它确保在整个应用程序中只有一个实例。通过使用单例模式,可以使脚本之间的通信更加简单和方便,因为每个脚本都可以直接访问单例实例。

以下是使用单例模式实现脚本之间通信的步骤:
1、在需要作为单例的脚本中添加一个静态变量,用于存储单例实例,并在 Awake() 方法中将其赋值为当前实例,例如:

using UnityEngine;

public class SingletonScript : MonoBehaviour
{
    private static SingletonScript _instance;

    public static SingletonScript Instance
    {
        get { return _instance; }
    }

    private void Awake()
    {
        if (_instance != null && _instance != this)
        {
            Destroy(this.gameObject);
        }
        else
        {
            _instance = this;
        }
    }

    // 在这里编写其他方法和属性
}

2、在其他需要访问单例的脚本中,可以使用 SingletonScript.Instance 来访问单例实例,例如:

using UnityEngine;

public class OtherScript : MonoBehaviour
{
    private void Start()
    {
        SingletonScript singleton = SingletonScript.Instance;
        if (singleton != null)
        {
            // 在这里访问单例的方法和属性
        }
    }
}

在这个例子中,我们在 SingletonScript 脚本中添加了一个静态变量(_instance),用于存储单例实例。在 Awake() 方法中,我们检查单例实例是否已存在,如果已存在,则销毁当前 GameObject,否则将其赋值为当前实例。这样可以确保在整个应用程序中只有一个 SingletonScript 实例。

在其他需要访问 SingletonScript 实例的脚本中,我们可以使用 SingletonScript.Instance 来访问单例实例。由于 SingletonScript.Instance 是一个静态属性,因此可以在任何地方访问它。

这就是使用单例模式在 Unity 中实现脚本之间通信的方式。使用单例模式可以使脚本之间的通信更加方便和简单,因为每个脚本都可以直接访问单例实例。

五、把变量或者方法定义成static类型

将变量和方法定义为静态(static)可以使它们在整个应用程序中都可用,而不需要实例化对象。这可以在一定程度上简化代码,并使其更加可读和易于维护。在 Unity 中,静态变量和方法可以用于实现脚本之间的通信和共享数据。

以下是将变量和方法定义为静态的示例:
1、静态变量

using UnityEngine;

public class StaticScript : MonoBehaviour
{
    public static int score = 0;
    
    // 在这里编写其他方法和属性
}

在这个例子中,我们将 score 变量定义为静态,这意味着它可以在整个应用程序中访问,而不需要实例化 StaticScript 对象。可以在其他脚本中通过 StaticScript.score 来访问 score 变量。
2、静态方法

using UnityEngine;

public class StaticScript : MonoBehaviour
{
    public static void PrintMessage(string message)
    {
        Debug.Log(message);
    }
    
    // 在这里编写其他方法和属性
}

在这个例子中,我们将 PrintMessage() 方法定义为静态,这意味着它可以在整个应用程序中访问,而不需要实例化 StaticScript 对象。可以在其他脚本中通过 StaticScript.PrintMessage() 来调用 PrintMessage() 方法。

使用静态变量和方法可以使代码更加简单和可读,因为它们可以在整个应用程序中共享数据和方法。但是,静态变量和方法也可能会导致代码不易于测试和维护,因为它们可能会对全局状态造成影响。因此,在使用静态变量和方法时,需要仔细考虑其在应用程序中的作用和影响。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。