IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【Unity3D】跨脚本委托,没有效果的可能性排查 -> 正文阅读

[游戏开发]【Unity3D】跨脚本委托,没有效果的可能性排查

宇宙第一小正太\ (o)/~萌量爆表求带飞=≡Σ((( つo)つ~ dalao们点个关注呗~


如果您尚且对“委托”的概念感到陌生,小熊在本文的末尾“福利时间”,稍微讲到了这个概念,(虽然可能不太对 )微软的官方文档本熊建议你可以去看看,那个写的应该会比我专业很多QAQ。不过,我在本文的末尾,同样还更新了C++的一个“模仿”C#委托的程序,希望对您有帮助。

问题描述:

最近笔者在研究Unity3D引擎的时候,发现,跨脚本委托的时候,无法委托,而且无法绑定(注册的委托函数,引擎的控制台会提示:找不到实例),然儿在VS2019下面是提示NO Problem,没有错误。

源代码:

GLEventSyste.cs
设计初衷:定义一个委托,然后向别的脚本发送消息,如果使用SendMessage也不是不可以,但是我不喜欢,比较学习算法的,一切都是向着效率看齐对吧hhh。
别的脚本的函数绑定在了MDChain上面,这样当我调用一次MDChain,那么其他的被绑定的函数都会被执行。

public class GLEventSystem : MonoBehaviour {
	//委托的声明和定义	
    public delegate void MessageDelegate(int a);
    public MessageDelegate MDChain = null;
    public static int a;
    void printM(int a) {
    	//提示自己,这个委托发出的消息是从这个模块发送的。
        print("现在发出消息的是全局脚本系统哦");
    }
    // Start is called before the first frame update
    private void Awake() {
    	//先自己绑定自己的委托函数。用来测试。
        MDChain += printM;
    }
    void Start() {
        MDChain(9);
    }
}

S.cs
设计初衷:用来绑定上面脚本中的委托函数。
最关键的地方就在于,在本脚本中,我将本脚本的PPPP函数绑定在了MDChain这个委托上面。

public class S : MonoBehaviour {
    private void Awake() {
    	//因为在Unity中,放入了一个空的物体,然后这个空的物体挂在了GLEventSyste.cs这个脚本,所以说,需要在这里首先要找到这个空物体,然后再找到这个脚本。
        //全局消息注册系统
        if (_GLEventSystem == null) {
            _GLEventSystem = GameObject.Find("GLEventSystem");
            if (_GLEventSystem == null)
                Debug.LogError("找不到全局控制器,未能注册全局消息系统QAQ");
        }
    }
    // Start is called before the first frame update
    void Start() {
        if (_GLEventSystem != null) {
            Debug.Log("已经跨脚本绑定啦");
            _GLEventSystem.GetComponent<GLEventSystem>().MDChain += this.PPPP;
        }
    }

    void PPPP(int a) {
        Debug.Log("嘤嘤嘤,你这个是跨脚本调用了哦!");
    }
}

Unity层级视图
在这里插入图片描述

问题复现:

当运行的时候:
在这里插入图片描述
我们期望的结果:
在这里插入图片描述

解决办法:

我百思不得其解,后来我想明白了。
其实就是脚本的调用顺序的问题。
因为不同脚本的调用时许是不同的,所以这就会引发一些调用方面的问题了。
所以,只需要在这里插入图片描述
让S脚本先去执行,先去绑定,然后这样就可以被调用了。靠,卡住了本熊6个小时啊,本熊做梦都在想着这个问题hhh。

小福利Time:

对于不知道指针概念的同学:
本熊的独家理解“委托”:委托就是一个变量。
我们知道变量有int,float这些,但是有没有想过,我们现在有一个变量,它的变量就是一个函数的声明。
比如现在:internal delegate void FBES();
那么internal是范围修饰符,delegate意味着它是一个委托,FBES意味着这个是新的一种类型的变量。这个新类型指的是,它是一个函数,也就是这个函数它的返回值是void然后他的参数是int
然后FBES fbes = null;或者FBES fbes = FBES(你想要绑定函数的函数名);
定义了一个类型为FBESfbes的变量。
现在这个变量它就可以用来传递函数了。而且是你绑定的函数。
比如:现在我想传入一个函数,作为另外一个函数的参数。
例子如下:

	void QAQ我的参数是函数(int a,int b,FBES Function){
	}

现在QAQ我的是参数是函数的这个函数的第三个参数就是一个是“函数”变量的参数了。
然后我们就可以在这个函数里面,使用这个Function变量,来调用另一个函数啦。

一下是代码全部样貌:

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

public class S2 : MonoBehaviour {
    //下面的那个是一个委托
    internal delegate void FBES();
    void QAQ我的参数是函数(int a, int b, FBES Function) {
        Function();
    }
    void 我的专业是にほ語() {
        Debug.Log("但是日语学不会就转计算机了呜呜呜");
    }
    private void Start() {
        QAQ我的参数是函数(1, 2, 我的专业是にほ語);
    }
}

对于知道指针概念的同学:
我觉得,C井的委托挺像C++里面的指针的QAQ。(虽然肯定不是一个东西啦(比如C++对指针没有重载+=运算符),但是我真心觉得他们好像呐,也不知道我理解的对不对。)
C井:
internal delegate void FBES();
C++:
typedef int(FallBcak)(int);
下面是C++的代码全貌:

//模仿C#里面的委托
#include <iostream>
using namespace std;
typedef int(FallBcak)(int);
int SayHello(int a);
//我的参数是函数,下面的是拼音😀
void MyCanShuShiHanShu(FallBcak);
int main() {
    FallBcak* p = SayHello;
    p(3);
    MyCanShuShiHanShu(SayHello);
    return 0;
}

int SayHello(int a) {
    cout << "你好呀小千同学,传入的参数是:" << a << endl;
}

void MyCanShuShiHanShu(FallBcak Fun) {
    Fun(20020109);
}

我水平也不是太高,就是做个自我记录,我摸索Unity是从7月中旬开始的,到今天还没有满一个月,C井学的更是一塌糊涂,还要继续加油www

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:32:59  更:2021-08-09 10:33:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 3:29:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码