Unity3D 调用其他脚本函数方法

Posted Sakuya__

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D 调用其他脚本函数方法相关的知识,希望对你有一定的参考价值。

        在Unity中,我们经常需要在某个脚本中调用另外一个脚本中的函数,这时候问题就来了,我们该怎么让一个脚本中的函数被其他脚本访问到呢?其实有很多种方法,在这里记录一下,防止以后忘记。


(一)、被调用脚本函数为static类型,调用时直接用  类名.函数名()

        对于静态的公有函数或变量,是可以在别的类中直接使用类名.函数名类名.变量名调用的,通常在GameManager或SoundManager这种整个游戏中都可能会调用到其中函数的脚本会这样使用。

        ① 静态公有函数,使用类名.函数名()直接调用。例如:

public class GameManager : MonoBehaviour 

    public static void HaHaHa()
    
        
    


// 在其他脚本中调用HaHaHa()函数
GameManager.HaHaHa();

        ② 单例模式,通过静态变量调用类中的公有函数,变量声明为static,函数不需要再声明为static。例如:

public class SoundManager : MonoBehaviour

    private static SoundManager _instance;
    public static SoundManager Instance  get  return _instance;  

    private void Awake()
    
        _instance = this;
    

    public void HaHaHa()
    
        
    


// 在其他脚本中调用HaHaHa()函数
SoundManager.Instance.HaHaHa();


(二)、通过获取需要调用脚本所挂载在的游戏对象,再从该游戏对象上获取脚本并调用其中函数

        先通过GameObject.Find("脚本所挂载在的物体的名字")找到游戏对象,再通过GetComponent<脚本名>().函数名()调用脚本中的函数,只能调用public类型函数。例如:

Enemy .cs脚本挂载在游戏对象“Enemy_1”上,需要在别的脚本中调用其中的TakeDamage()函数。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour

    public void TakeDamage()
    
        
    



// 在其他脚本中调用TakeDamage()函数
GameObject.Find("Enemy_1").GetComponent<Enemy>().TakeDamage();

(三)、通过获取需要调用脚本所挂载在的游戏对象,再通过发送消息调用其中函数

        先通过GameObject.Find("脚本所挂载在的物体的名字")找到游戏对象,再通过SendMessage("函数名")调用脚本中的函数,可以调用public和private类型函数。例如:

Enemy .cs脚本挂载在游戏对象“Enemy_1”上,需要在别的脚本中调用其中的TakeDamage()函数。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour

    private void TakeDamage()
    
        
    



// 在其他脚本中调用TakeDamage()函数
GameObject.Find("Enemy_1").SendMessage("TakeDamage", SendMessageOptions.DontRequireReceiver);

        除了SendMessage,还有SendMessageUpwards和BroadcastMessage函数,三个函数的参数相似,都是方法名+方法的参数+额外信息选项组成。

SendMessageOptions

  1. SendMessageOptions.RequireReceiver //如果没有找到相应函数,会报错(默认是这个状态)
  2. SendMessageOptions.DontRequireReceiver //即使没有找到相应函数,也不会报错,自动忽略

区别

  1. SendMessage仅向指定对象的所有脚本推送消息
  2. SendMessageUpwards向指定对象和它的所有父物体推送消息
  3. BroadcastMessage向指定对象和它的所有子物体推送消息

如何在 Roblox 中调用其他脚本文件中的函数

【中文标题】如何在 Roblox 中调用其他脚本文件中的函数【英文标题】:How to call functions in other script files in Roblox 【发布时间】:2010-11-06 12:47:11 【问题描述】:

我在包含函数的工作区中嵌入了一个脚本文件。我想从嵌入在工作区的子对象中的脚本文件中调用这些函数。我不想将这些函数复制并粘贴到多个脚本文件中。我认为如果可能的话,面向对象的方法会是最好的。

【问题讨论】:

需要注意的是,BindableFunctions 和 RemoteFunctions 现在可能很有趣;远程函数甚至可以让你在服务器和客户端之间调用函数 【参考方案1】:

_G 的替代方法是使用全局可用的表 shared。 Shared 的使用方式与 _G 相同,但您必须在变量标识符之前指定“shared”,这与 _G 不同,在 _G 中您只能写变量名而没有 _G (not anymore in ROBLOX)。 Shared 用于以下上下文:

shared["variablename"] = value

就像在全局堆栈中一样,_G。 共享用法示例:

脚本 1

shared["rprint"] = function(array) for i,v in pairs(array) do print(i, v) end end

脚本 2

repeat wait() until shared["rprint"]
shared.rprint("Hello, ", "How", " are", " you?")

此脚本的输出将是“你好,你好吗?”

【讨论】:

投票赞成,因为 _G 变量已从 Roblox 脚本 API 中删除。这个答案显示了现在用于在脚本之间“共享”值的表。 好。人们应该知道共享,因为当您别无选择时,它非常重要。 维基说你仍然可以使用_G wiki.roblox.com/index.php/Function_Dump/Core_Functions#G @JonLyles “无需在前面写 _G 就可以从中读取值。现在情况不再如此。” (来自维基)【参考方案2】:

最简单的方法是使用 _G 或 shared。

在一个脚本中,

_G.myFunction = function(Arguments)

-- blah

end

在另一个脚本中,您将使用此代码。

repeat wait() until _G.myFunction ~= nil

_G.myFunction()

这也适用于共享的全局表,而不是 _G。

【讨论】:

【参考方案3】:

我知道之前已经说过了,但是用普通的_G或者shared来访问就行了。

脚本一

_G.myFunction = function()
     print("Hello, myFunction!")
end

脚本二

repeat wait() until _G.myFunction()
_G.myFunction()

输出

你好,我的函数!

【讨论】:

【参考方案4】:

您可以将函数设为全局。在 一个脚本可以做到这一点:

_G.myFunction = function() print("Hello World") end

在另一个脚本中这样做:

repeat wait() until myFunction myFunction()

通过定义一个函数是 _G 你必须 等待脚本执行 分配功能,然后您可以 即使没有调用该函数 指定_G。

这将不起作用,因为由于 ROBLOX 更新,您现在必须在访问 _G 中的项目时对其进行索引。

您也不能在 ROBLOX 中使用 dofile(),正如我在上面看到的那样。

回答这个问题:您需要通过添加 _G.MyFunction = function(parameters) end 在一个脚本中创建一个函数到全局表 - _G 中。在另一个脚本中,您需要在 _G 表中访问它 - _G.MyFunction()。

ROBLOX 脚本编写者出现的一个常见问题是,您尝试在创建 _G 之前访问您的函数。解决这个问题的一个简单方法是添加一个等待,直到它被创建,正如 Camoy 的帖子所建议的那样:

repeat wait() until _G.MyFunction() 

【讨论】:

【参考方案5】:

您可以将函数设为全局。在一个脚本中执行以下操作:

_G.myFunction = function() print("Hello World") end

在另一个脚本中这样做:

repeat wait() until myFunction myFunction()

通过定义一个函数为_G,你必须等待脚本执行分配函数,然后你可以调用该函数,即使不指定_G。

【讨论】:

then you can call the function even without specifying _G 不再是【参考方案6】:

我会使用 BindableEvents 或 RemoteEvents。我认为这是比使用 _G 更好的方法。这将允许您将所有内容保留在本地。您可以使用 Bindableevents 和 RemoteEvents 来触发函数并在脚本之间来回发送所需的尽可能多的数据。使用 BindableEvents 进行服务器/服务器通信,使用 RemoteEvents 进行服务器/客户端-客户端/服务器通信。

http://wiki.roblox.com/index.php?title=API:Class/BindableEvent

【讨论】:

【参考方案7】:

您可以使用已添加的模块脚本。你可以把函数放在那里,然后在其他任何地方调用和使用它们!

【讨论】:

以上是关于Unity3D 调用其他脚本函数方法的主要内容,如果未能解决你的问题,请参考以下文章

在unity3D: c# 怎样调用另外一个c#脚本里面东西?

Unity3D中用JavaScript写脚本,如何引用其他JS脚本?

unity中三种调用其他脚本函数的方法

unity中三种调用其他脚本函数的方法

Unity3D如何调用另外一个脚本里的函数呢

shell脚本怎么调用其他shell脚本