当前位置:   article > 正文

Unity3D中SendMessage的简单使用_unity sendmessage

unity sendmessage

一、简介 

Unity提供的消息推送机制可以非常方便我们的脚本开发,它实现的是一种 伪监听者模式,利用的是反射机制。 

 一共有3种实现方式:

  1. //1.发送给自身的所有脚本 (只发给自身所有脚本)
  2. SendMessage("方法名称");
  3. //2.发送给自身的所有脚本以及自身父物体,父物体的父物体等身上所有脚本 (发给自己和父物体,及父物体的父物体 往上调用)
  4. SendMessageUpwards("方法名称");
  5. //3.还有发给自己和子物体,及子物体的子物体,往下调用。
  6. BroadcastMessage("方法名称");

二、准备工作

新建SendMessageTest 类,这个类负责发送消息

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class SendMessageTest : MonoBehaviour
  5. {
  6. void Start()
  7. {
  8. // 发送给自身的所有脚本
  9. SendMessage("GetMessage");
  10. // 发送给自身的所有脚本以及自身父物体,父物体的父物体等身上所有脚本
  11. //SendMessageUpwards("GetMessage");
  12. // 发送给自身的所有脚本以及自身子物体,子物体的子物体等身上所有脚本
  13. //BroadcastMessage("GetMessage");
  14. }
  15. private void GetMessage()
  16. {
  17. Debug.Log("SendMessageTest脚本,自己本身,方法类型private");
  18. }
  19. }

我们在新建三个类,分别挂载在父物体,自己本身,子物体上

GetMessageSelf 类

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. //自己本身
  5. public class GetMessageSelf : MonoBehaviour
  6. {
  7. private void GetMessage()
  8. {
  9. Debug.Log("GetMessageSelf脚本,自己本身,方法类型private");
  10. }
  11. }

GetMessageChild 类 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class GetMessageChild : MonoBehaviour
  5. {
  6. public void GetMessage()
  7. {
  8. Debug.Log("GetMessageChild脚本,子物体,方法类型public");
  9. }
  10. }

 GetMessageParent 类

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. //父物体
  5. public class GetMessageParent : MonoBehaviour
  6. {
  7. protected void GetMessage()
  8. {
  9. Debug.Log("GetMessageParent脚本,父物体,方法类型protected");
  10. }
  11. }

将这三个类挂载到对应物体上

self物体挂载

 Parent物体挂载

 Child物体挂载

三、具体实现 

 1.执行SendMessageTest 的SendMessage()方法效果

SendMessageTest类和GetMessageSelf类中的GetMessage()被执行

 2.执行SendMessageTest 的SendMessageUpwards()方法效果

SendMessageTest类、GetMessageSelf类和GetMessageParent中的GetMessage()被执行

 3.执行SendMessageTest 的BroadcastMessage()方法效果

 SendMessageTest类、GetMessageSelf类和GetMessageChild中的GetMessage()被执行

四、扩展

1.如果方法中需要传值怎么办?

我们新建一个物体挂载脚本

  1. public class SendMessageTest : MonoBehaviour
  2. {
  3. void Start()
  4. {
  5. // 发送给自身的所有脚本
  6. SendMessage("GetMessage","AAAA");
  7. }
  8. private void GetMessage(string a)
  9. {
  10. Debug.Log("收到的消息"+a);
  11. }
  12. }

运行效果:

 2.如果SendMessage()没有找到方法,想让他打印未找到的错误提示?

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class SendMessageTest : MonoBehaviour
  5. {
  6. void Start()
  7. {
  8. SendMessage("GetMessageAA", SendMessageOptions.RequireReceiver);
  9. }
  10. private void GetMessage()
  11. {
  12. Debug.Log("收到的消息");
  13. }
  14. }

 SendMessageOptions枚举,SendMessage()方法默认SendMessageOptions是 DontRequireReceiver

  1. public enum SendMessageOptions
  2. {
  3. //提示错误信息
  4. RequireReceiver = 0,
  5. //不提示错误信息
  6. DontRequireReceiver = 1
  7. }

3. 如果方法需要多种参数如何传值?

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class SendMessageTest : MonoBehaviour
  5. {
  6. int a = 1;
  7. string b = "BBBB";
  8. bool c = false;
  9. object[] _obj;//使用object[] 数组存储方法所需要的值
  10. void Start()
  11. {
  12. _obj = new object[] { a,b,c};
  13. // 发送给自身的所有脚本
  14. SendMessage("GetMessage", _obj);
  15. }
  16. private void GetMessage(object[] obj)
  17. {
  18. Debug.Log("参数1: "+ obj[0]);
  19. Debug.Log("参数2: "+ obj[1]);
  20. Debug.Log("参数3: "+ obj[2]);
  21. }
  22. }

五、总结

SendMessage发送方式一共有三种:

1. SendMessage("方法名"); //发送给自身的所有脚本

2.SendMessageUpwards("方法名"); //发送给自身的所有脚本以及自身父物体,父物体的父物体等身上所有脚本

3.BroadcastMessage("方法名"); //发送给自身的所有脚本以及自身子物体,子物体的子物体等身上所有脚本

 两种SendMessageOptions方式

1.SendMessage("方法名", SendMessageOptions.RequireReceiver);//未找到方法,报错

2.SendMessageUpwards("方法名", " SendMessageOptions.DontRequireReceiver); //默认模式 未找到方法,不报错

任何访问修饰符的方法都会被调用(上方举例中测试了 public private protected)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/126800
推荐阅读
相关标签
  

闽ICP备14008679号