如何不绑定脚本且不继承MonoBehaviour做U3D的开发

2024-02-11 17:38

本文主要是介绍如何不绑定脚本且不继承MonoBehaviour做U3D的开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要点:我们把脚本绑在对象上为什么不把对象抓到脚本里殴打呢?

问题:那不继承Mono的话,协同以及实例化,以及每帧运算该怎么去做呢?

最近看到一个做技能冷却的话题,所以也想去尝试一下。

1.这是界面2D和3D摄像机

2.这是对象排布

3.代码

(1)主要负责UI的界面

[C#] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<font style= "color:rgb(51, 51, 51)" > using Assets.Classes.com.system;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace Assets.Classes.com.view.ui
{
     enum SKILLTYPE
     {
         Q_SKILL = 10, //→_→代表该技能的冷却时间
         W_SKILL = 20,
         E_SKILL = 30,
         R_SKILL = 100
     }
     class SkillsMenu_UI
     {
         private SKILLTYPE skillType; //技能类型
         private bool isSkill = false ; //是否正在释放技能
         private bool isCooling = false ; //是否正在冷却
         private float coolingTime; //冷却时间
         private GameObject currentObj;
         public SkillsMenu_UI(GameObject skillsObj)
         {
         //    GameObject go = (GameObject)GameObject.Instantiate(skillsObj);
          //   new PanelHandler().RootHandler(skillsObj);
             HandlerListener( "Q_Skill" , skillsObj);
             HandlerListener( "W_Skill" , skillsObj);
             HandlerListener( "E_Skill" , skillsObj);
             HandlerListener( "R_Skill" , skillsObj);
         }
         private void HandlerListener( string skillName, GameObject go)
         {
             Transform Skill = go.transform.FindChild(skillName);
             UIEventListener.Get(Skill.gameObject).onClick = OnClick;
         }
         private void OnClick(GameObject go)
         {          
             Debug.Log( "点击了技能按钮 : " + go.name);
             switch (go.name)
             {
                 case "Q_Skill" : skillType = SKILLTYPE.Q_SKILL; HandlerSkill(skillType, go); break ;
                 case "W_Skill" : skillType = SKILLTYPE.W_SKILL; HandlerSkill(skillType, go); break ;
                 case "E_Skill" : skillType = SKILLTYPE.E_SKILL; HandlerSkill(skillType, go); break ;
                 case "R_Skill" : skillType = SKILLTYPE.R_SKILL; HandlerSkill(skillType, go); break ;
             }
         }
         private void HandlerSkill(SKILLTYPE type, GameObject go)
         {
             if (!isCooling || !isSkill) //是否冷却或者是否有技能没有释放
             {
                 currentObj = go;
                 skillType = type;
                 isSkill = true ;
                 isCooling = true ;
                 HandlerCoolingTimer(type);
                 Debug.Log( "可以释放该技能了" );
             }
             else
             {
                 Debug.Log( "不可释放技能" );
             }
         }
         private void HandlerCoolingTimer(SKILLTYPE type)
         {
             coolingTime = ( float )type;
             currentObj.transform.FindChild( "Fore" ).gameObject.GetComponent<UISprite>().fillAmount = 1;
             GameController.getInstance().addInterval(TimerCutting);
             Debug.Log( "开始倒计时" );
         }
         private void TimerCutting( float t)
         {           
             currentObj.transform.FindChild( "Fore" ).gameObject.GetComponent<UISprite>().fillAmount -= (1.0f / coolingTime) * Time.deltaTime;
             float tempTime = currentObj.transform.FindChild( "Fore" ).gameObject.GetComponent<UISprite>().fillAmount;
             Debug.Log( "------------coolingTime : " + tempTime);
             if (tempTime <= 0.01f)
             {
                 isSkill = false ;
                 isCooling = false ;
                 GameController.getInstance().removedInterval(TimerCutting); 
             }
         }
     }
}</font>

设计思想:外界需要处理这个界面的时候,只需要声明对象new 这个类的有参构造函数即可,然后默认进行一系列初始化动作。


这个是替代自带的OnClick()事件,采用事件事件监听机制。

其他略。

(2)

如果我需要每帧去计算的要求我该怎么办?

那就写一个可以控制全局的每帧运算。

      

[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
        * 游戏主循环
        */
      private static GameController m_instance;
       List<Action< float >> intervalCallFuns;
       public void mainLoop()
       {
           interval(Time.deltaTime);
       }
       public void interval( float t)
       {
           List<Action< float >> tempIntervalCallFuns = intervalCallFuns;
           foreach (Action< float > intervalCallFun in tempIntervalCallFuns)
           {
               intervalCallFun(t);
           }
           tempIntervalCallFuns = null ;
       }
       /*
        *  添加每帧回调
        *        @param:需要回调的函数
        */
       public void addInterval(Action< float > callFun)
       {
           if (!intervalCallFuns.Equals(callFun))
           {
               intervalCallFuns.Add(callFun);
           } else
           {
               Debug.LogWarning( "add interval already exists!" );
           }
       }
       /*
        *  移除每帧回调函数
        *        @param:需要移除的回调函数
        */
       public void removedInterval(Action< float > callFun)
       {
           List<Action< float >> tempIntervalCallFuns = new List<Action< float >>();
           foreach (Action< float > tempFun in intervalCallFuns)
           {
               if (tempFun != callFun) tempIntervalCallFuns.Add(tempFun);
           }
           intervalCallFuns = tempIntervalCallFuns;
           tempIntervalCallFuns = null ;
       }

设计思想:这个类用字典去存储需要进行每帧运算的函数,然后默认去每帧遍历,并带有从字典中移除函数的功能。

(3)启动程序,启动游戏主循环。

Main类挂在一个GameObject上,负责游戏启动,只负责游戏的主循环,不管其他的操作。

[C#] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
<font style= "color:rgb(51, 51, 51)" > using UnityEngine;
public class Main : MonoBehaviour
{
     void Start()
     {
         
     }
     void Update()
     {
         GameController.getInstance().mainLoop();
     }
}</font>

test.cs在他需要的时候去new SkillsMenu_UI(Skills对象)。

new SkillsMenu_UI(gameObject.transform.FindChild("Skills").gameObject);



整个程序就可完美启动起来。


总结,这样的设计多用于解耦和模块的划分。

不用频繁绑定脚本,给public对象绑定对象,一些都在代码中完成。


转载请注明出处。
作者: 大帅纷纭

邮箱:bandit_empire@163.com



文字转载自 如何不绑定脚本且不继承MonoBehaviour做U3D的开发,感谢 大帅纷纭提供好文章



这篇关于如何不绑定脚本且不继承MonoBehaviour做U3D的开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/700415

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD