unity 如何脚本间交互

  1. 如何脚本间交互:

方法1:

通过在编辑器里面拖动,来持有这个对象去调用对应的函数,这个方法比较简单。

在编辑器中新建2个脚本。

我们写一个a脚本

public class Ascript : MonoBehaviour {

// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

}

public void DoSomething()

{

Debug.LogWarning ("Ascript .. DoSomething .. Call");

}

}

我们想Main脚本去调用A脚本。我们就在Main 写一个A对象。

public Ascript ascript_;

这个是在代码编写的时候已经可以调用A对象的public 函数。

if (ascript_)

ascript_.DoSomething ();

但其实这个ascript_ 对象是空的,我们要对它赋值。这个时候我们在编辑器拖一个有a脚本的实体对象上去就可以了。

我们看见Debug.LogWarning ("Ascript .. DoSomething .. Call");有执行。

方法2:

我们把上面的直接调用改成

if (ascript_)

ascript_.SendMessage ("DoSomething");

我们把a脚本里面的DoSomething函数的public 去掉。

我们看见Debug.LogWarning ("Ascript .. DoSomething .. Call");有执行。

我们尝试给函数加一些参数,看看结果。

我们对A脚本的 DoSomething 进行修改。

void DoSomething(int param1)

{

Debug.LogWarning (string.Format("{0} {1}","Ascript .. DoSomething .. Call",param1));

}

如果我们脚本中有2个同名的函数会怎么样呢。

测试结果是谁在上面谁就会被调用。

可以在后面加一个参数。


RequireReceiver


A receiver is required for SendMessage.

if (ascript_) ascript_.SendMessage("DoSomething",2,SendMessageOptions.RequireReceiver);

我们把 a脚本的 DoSomething 函数删掉。

结果报错了

我们把参数换了试试。

if (ascript_) ascript_.SendMessage("DoSomething",2,SendMessageOptions.DontRequireReceiver);

我们发现不报错了。

  1. Public static

我们a脚本的DoSomething函数改成

public static void DoSomething()

{

Debug.LogWarning(string.Format("{0} {1}","Ascript .. DoSomething .. Call","static function"));

}

我们直接 Ascript.DoSomething ();调用就可以了。

我们再在这个基础上面改成下面这个样子。

public class Ascript : MonoBehaviour {

public static Ascript aStatic;

// Use this for initialization

void Start () {

aStatic = this;

}

// Update is called once per frame

void Update () {

}

public void DoSomething()

{

Debug.LogWarning(string.Format("{0} {1}","Ascript .. DoSomething .. Call","static Object"));

}

}

我们把调用的改成,Ascript.aStatic.DoSomething ();

我们这个时候已经不持有这个对象了。

但是场景一定要这个对象,如果没有的话会报下面的错。

如果我们场景里面有很多这个对象,他会找到这个对象最早生成的那个,注意不是你创建的实体对象而是第一个拖上这个脚本的对象。

  1. 如何脚本间交互:

方法1:

通过在编辑器里面拖动,来持有这个对象去调用对应的函数,这个方法比较简单。

在编辑器中新建2个脚本。

我们写一个a脚本

public class Ascript : MonoBehaviour {

// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

}

public void DoSomething()

{

Debug.LogWarning ("Ascript .. DoSomething .. Call");

}

}

我们想Main脚本去调用A脚本。我们就在Main 写一个A对象。

public Ascript ascript_;

这个是在代码编写的时候已经可以调用A对象的public 函数。

if (ascript_)

ascript_.DoSomething ();

但其实这个ascript_ 对象是空的,我们要对它赋值。这个时候我们在编辑器拖一个有a脚本的实体对象上去就可以了。

我们看见Debug.LogWarning ("Ascript .. DoSomething .. Call");有执行。

方法2:

我们把上面的直接调用改成

if (ascript_)

ascript_.SendMessage ("DoSomething");

我们把a脚本里面的DoSomething函数的public 去掉。

我们看见Debug.LogWarning ("Ascript .. DoSomething .. Call");有执行。

我们尝试给函数加一些参数,看看结果。

我们对A脚本的 DoSomething 进行修改。

void DoSomething(int param1)

{

Debug.LogWarning (string.Format("{0} {1}","Ascript .. DoSomething .. Call",param1));

}

如果我们脚本中有2个同名的函数会怎么样呢。

测试结果是谁在上面谁就会被调用。

可以在后面加一个参数。


RequireReceiver


A receiver is required for SendMessage.

if (ascript_) ascript_.SendMessage("DoSomething",2,SendMessageOptions.RequireReceiver);

我们把 a脚本的 DoSomething 函数删掉。

结果报错了

我们把参数换了试试。

if (ascript_) ascript_.SendMessage("DoSomething",2,SendMessageOptions.DontRequireReceiver);

我们发现不报错了。

  1. Public static

我们a脚本的DoSomething函数改成

public static void DoSomething()

{

Debug.LogWarning(string.Format("{0} {1}","Ascript .. DoSomething .. Call","static function"));

}

我们直接 Ascript.DoSomething ();调用就可以了。

我们再在这个基础上面改成下面这个样子。

public class Ascript : MonoBehaviour {

public static Ascript aStatic;

// Use this for initialization

void Start () {

aStatic = this;

}

// Update is called once per frame

void Update () {

}

public void DoSomething()

{

Debug.LogWarning(string.Format("{0} {1}","Ascript .. DoSomething .. Call","static Object"));

}

}

我们把调用的改成,Ascript.aStatic.DoSomething ();

我们这个时候已经不持有这个对象了。

但是场景一定要这个对象,如果没有的话会报下面的错。

如果我们场景里面有很多这个对象,他会找到这个对象最早生成的那个,注意不是你创建的实体对象而是第一个拖上这个脚本的对象。

  1. 单例模式

我们参考http://wiki.unity3d.com/index.php/Singleton

public class MyClass : MonoBehaviour {
	void Awake () {
		Debug.Log(Manager.Instance.myGlobalVar);
	}
}
public class Manager : Singleton<Manager> {
	protected Manager () {} // guarantee this will be always a singleton only - can‘t use the constructor!
 
	public string myGlobalVar = "whatever";
}

using UnityEngine;

/// <summary>
/// Be aware this will not prevent a non singleton constructor
/// such as `T myT = new T();`
/// To prevent that, add `protected T () {}` to your singleton class.
///
/// As a note, this is made as MonoBehaviour because we need Coroutines.
/// </summary>
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;

private static object _lock = new object();

public static T Instance
{
get
{
if (applicationIsQuitting) {
Debug.LogWarning("[Singleton] Instance ‘"+ typeof(T) +
"‘ already destroyed on application quit." +
" Won‘t create again - returning null.");
return null;
}

lock(_lock)
{
if (_instance == null)
{
_instance = (T) FindObjectOfType(typeof(T));

if ( FindObjectsOfType(typeof(T)).Length > 1 )
{
Debug.LogError("[Singleton] Something went really wrong " +
" - there should never be more than 1 singleton!" +
" Reopening the scene might fix it.");
return _instance;
}

if (_instance == null)
{
GameObject singleton = new GameObject();
_instance = singleton.AddComponent<T>();
singleton.name = "(singleton) "+ typeof(T).ToString();

DontDestroyOnLoad(singleton);

Debug.Log("[Singleton] An instance of " + typeof(T) +
" is needed in the scene, so ‘" + singleton +
"‘ was created with DontDestroyOnLoad.");
} else {
Debug.Log("[Singleton] Using instance already created: " +
_instance.gameObject.name);
}
}

return _instance;
}
}
}

private static bool applicationIsQuitting = false;
/// <summary>
/// When Unity quits, it destroys objects in a random order.
/// In principle, a Singleton is only destroyed when application quits.
/// If any script calls Instance after it have been destroyed,
/// it will create a buggy ghost object that will stay on the Editor scene
/// even after stopping playing the Application. Really bad!
/// So, this was made to be sure we‘re not creating that buggy ghost object.
/// </summary>
public void OnDestroy () {
applicationIsQuitting = true;
}
}

时间: 2024-10-10 03:36:57

unity 如何脚本间交互的相关文章

[Unity-20] Unity不同脚本之间的执行顺序

我们都知道,Unity中某个脚本的执行顺序是Awake.Start.Update.LateUpdate等,但是不同的脚本之间的执行顺序是怎样的呢? 例如我有两个脚本Script1和Script2,那么这两个脚本的Awake执行顺序是怎样的呢? 要知道真相我们就必须了解Unity后台的运行原理,其实Unity后台是单线程执行的,所谓的协程都是伪多线程.不同脚本的Awake在后台的执行真相是这样的: 后台Awake() { 脚本0Awake(); 脚本1Awake(); ........ } Sta

【HTML5】用脚本控制交互元素details元素的使用

1.源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Con

.Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇

一.前言 经过上几篇的学习,现在我们已经掌握了ActiveX的整个开发过程,但要发挥ActiveX的真正威力,必须依靠JS.下面一起来学习吧! 二.JS调用ActiveX方法 只需在UserControl子类中(即自定义的ActiveX控件中),编写公共方法即可. C# [Guid("0203DABD-51B8-4E8E-A1EB-156950EE1668")] public partial class Uploader : UserControl, IObjectSafety { p

Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)

所谓 IO 其实不过是与其他设备之间的数据交互.在 Linux 上这个概念或许会更加清楚一些.Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互.同样,与其他进程之间也存在着数据交互,这就是进程间交互. 为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到.每个需求都提供一种解决方案是不现实的.比如操作系统提供了查看当前文件夹下所有文件的命令(Windows 下是 dir, Linux 下是 ls),那么 Qt 就可以通过调用这个命令获取其中的信

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

Unity3D技术之Android 脚本高级 Unity 手机脚本

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 高级 Unity 手机脚本 设备属性 您可以访问一系列特定设备的属性:     SystemInfo.deviceUniqueIdentifier 唯一的设备标识. SystemInfo.deviceName 用户指定的设备名称. SystemInfo.deviceModel 设备型号. Sys

【转】如何在html与delphi间交互代码

[转]如何在html与delphi间交互代码 (2015-11-19 22:16:24) 转载▼ 标签: it 分类: uniGUI uniGUI总群中台中cmj朋友为我们总结了如下内容,对于利用delphi+uniGUI开发应用,可以说是精品,必须掌握.一句话,如何在html与delphi间交互代码,是最好的答案. [ClientEvents操作]Js存取Edit,Memo元件值getValue,setValue    MainForm.Edit1.setValue(“ABCDE”); //把

【Unity 3D】学习笔记二十七:unity游戏脚本(七)

使用C#编写游戏脚本 在前面提到,unity支持三种语言编写脚本:js,C#,boo.入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格.但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高.下面总结下怎么使用C#编写脚本. 继承MonoBehaviour类 在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类.为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来. 在pr

4种系统间交互方法比较

转载自:http://blog.csdn.net/zuocheng_liu/article/details/9035015 4种系统间交互方法比较 指相对独立子系统间的交互 指标\方式 API 数据文件 共享数据库 (web系统)根域名cookie 实效性 高 低 最高 实时 时间效率 高 低 最高 低 实时空间效率 低 高 低 - 实时占用带宽 低 低 低 低 系统设计正交性 高 高 低 低 系统设计耦合度 低 低 高 高 实现方式 同步/异步 异步 异步 异步 协议 http request