精华内容
下载资源
问答
  • MonoBehaviour是所有脚本的基类,使用javascript的话,每个脚本都会自动继承MonoBehaviour,但使用C#或Boo就必须显式从MonoBehaviour继承。 注意:复选框控件(在编辑中)仅仅会阻止Start、Awake、Update、...
  • 主要介绍了Unity通用泛型单例设计模式,分为普通型和继承MonoBehaviour,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • 使用时继承该单例,不用管什么多线程之的问题,也不用担心性能问题,因为在最开始的...第一个是不继承MonoBehaviour public class SingletonNull<T> where T : new() { private static T m_instance...

    使用时继承该单例类,不用管什么多线程之类的问题,也不用担心性能问题,因为在最开始的时候不管你要不要这个实例,都会被创建出来,所以只是在程序开始的时候消耗时间,到程序结束前不会销毁。

    第一个是不继承MonoBehaviour

    public class SingletonNull<T> where T : new()
    {
        private static T m_instance = default(T);
        protected SingletonNull() { }
        public static T Instance
        {
            get
            {
                if (m_instance == null)
                {
                    m_instance = new T();
                }
                return m_instance;
            }
        }
    }

    第二个是继承MonoBehaviour

    using UnityEngine;
    public class SingletonMono<T> : MonoBehaviour where T : SingletonMono<T>
    {
        private static T m_instance = default(T);
        public static T Instance
        {
            get
            {
                if (m_instance == null)
                {
                    GameObject go = null;
                    if (GameObject.Find("SingletonMono") == false)
                    {
                        go = new GameObject("SingletonMono");
                    }
                    if(go!=null)
                        m_instance = go.AddComponent<T>();
                }
                return m_instance;
            }
        }
    }

     

    展开全文
  • } } public abstract class MonoSingleton : MonoBehaviour where T : class { void Awake() { if(Service.IsRegistered) { DestroyImmediate(this); return; } #if UNITY_EDITOR var type = GetType(); var attrs ...

    仅作欣赏~
    实际业务中顶多Ins = this(但是得保证挂载得script仅一份啊,不然就没有单例的味道了)
    最多加个static、构造、DontDestroy和Destroy,哈哈。

    /*
    *R0-V1.0
    *Modify Date:2020-04-20
    *Modifier:ZoJet
    */
    
    using System;
    using UnityEngine;
    
    namespace UCL.Core {
        [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
        [System.Diagnostics.Conditional("UNITY_EDITOR")]
        sealed class ServiceFilterAttribute : Attribute {
            public string Name;
            public ServiceFilterAttribute(string name) {
                Name = name;
            }
        }
    
        public abstract class MonoSingleton<T> : MonoBehaviour where T : class {
            void Awake() {
                if(Service<T>.IsRegistered) {
                    DestroyImmediate(this);
                    return;
                }
    #if UNITY_EDITOR
                var type = GetType();
                var attrs = type.GetCustomAttributes(typeof(ServiceFilterAttribute), true);
                if(attrs.Length > 0) {
                    var sceneName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name;
                    var i = attrs.Length - 1;
                    for(; i >= 0; i--) {
                        if(System.Text.RegularExpressions.Regex.IsMatch(sceneName, ((ServiceFilterAttribute)attrs[i]).Name)) {
                            break;
                        }
                    }
                    if(i == -1) {
                        throw new UnityException(
                            string.Format("\"{0}\" service cant be used at scene \"{1}\"", type.Name, sceneName));
                    }
                }
    #endif
                Service<T>.Register(this as T);
                OnCreateService();
            }
    
            void OnDestroy() {
                if(Service<T>.IsRegistered) {
                    OnDestroyService();
                    Service<T>.Unregister(this as T);
                }
            }
    
            protected abstract void OnCreateService();
    
            protected abstract void OnDestroyService();
        }
    
        public static class Service<T> where T : class {
            static T _instance;
    
            public static bool IsRegistered {
                get {
                    return _instance != null;
                }
            }
    
            public static T Get() {
                if(_instance != null) {
                    return _instance;
                }
    
                var type = typeof(T);
                if(type.IsSubclassOf(typeof(ScriptableObject))) {
                    var list = Resources.FindObjectsOfTypeAll(type);
                    if(list == null || list.Length == 0) {
                        throw new UnityException(
                            string.Format("Service<{0}>.Get() can be used only with exists / loaded asset of this type", type.Name));
                    }
                    _instance = list[0] as T;
                    return _instance;
                }
    
    #if UNITY_EDITOR
                if(type.IsSubclassOf(typeof(Component)) && !type.IsSubclassOf(typeof(MonoSingleton<T>))){
                    throw new UnityException(
                        string.Format("\"{0}\" - invalid type, should be inherited from MonoSingleton", type.Name));
                }
    #endif
    
                if(type.IsSubclassOf(typeof(MonoSingleton<T>))) {
    #if UNITY_EDITOR
                    if(!Application.isPlaying) {
                        throw new UnityException(
                            string.Format("Service<{0}>.Get() can be used only at PLAY mode", type.Name));
                    }
    #endif
                    new GameObject(
    #if UNITY_EDITOR
                     "_SERVICE_" + type.Name
    #endif
                     ).AddComponent(type);
                } else {
                    Register(Activator.CreateInstance(type) as T);
                }
                return _instance;
            }
    
            public static void Register(T instance) {
                if(IsRegistered) {
                    throw new UnityException(
                        string.Format("Cant register \"{0}\" as service - type already registered", typeof(T).Name));
                }
                if(instance == null) {
                    throw new UnityException(
                        string.Format("Cant register null instance as service"));
                }
                _instance = instance;
            }
    
            public static void Unregister(T instance, bool force = false) {
                if(instance == _instance || force) {
                    _instance = null;
                }
            }
        }
    }
    
    展开全文
  • Unity中,需要挂载到游戏对象上的脚本都要继承MonoBehaviour,记住了,继承了MonoBehaviour的,不要写它的构造函数,因为Unity中对于MonoBehaviour的构造函数何时调用,调用几次,咱都不清楚。   所以如果想...

    在Unity中,需要挂载到游戏对象上的脚本都要继承MonoBehaviour,记住了,继承了MonoBehaviour的类,不要写它的构造函数,因为Unity中对于MonoBehaviour的构造函数何时调用,调用几次,咱都不清楚。

     

    所以如果想要初始化一个类,那么可以在Awake函数中写相关的代码。其构造函数默认空的就好。

    展开全文
  • unity3d文档里虽然说所有脚本继承MonoBehaviour类,但是你如果想自定义类,就可以不用继承MonoBehaviour,但是可以类只能调用其中的方法和属性,无法拖到场景的物体中使用。 MonoBehaviour里面的几十方法比如 ...

    unity3d文档里虽然说所有脚本继承MonoBehaviour类,但是你如果想自定义类,就可以不用继承MonoBehaviour,但是可以类只能调用其中的方法和属性,无法拖到场景的物体中使用。

    MonoBehaviour里面的几十方法比如

    Start(), Awake(), Update(), FixedUpdate(), OnGUI(),这几个方法不管你用哪一个,必须要继承MonoBehaviour
    用不用MonoBehaviour关键看要实现什么功能和属性,如果你的类不需要引擎提供的初始化,各种物理,渲染,着色器的回调,最好不要继承MonoBehaviour,游戏是需要优化节约资源的,如果你本身不需要那些功能,继承后,当引擎接触事件,触发的时候,就会反射调用个各种函数,这是很需要耗费资源的,不管咋样,GameObject还是要继承MonoBehaviour的,这样才能new实例化一个对象,但是其他类不要继承就行了。
    如果不继承Mono会有那些坏处呢?
    1:不能使用Invoke和Coroutine了。
    2:调试不方便了,不能在Inspector和Debug tab看到参数。同时如果一个类不继承Mono,那么这个类的List表也无法在Debug界面看到。
    3:不是自动调用Start,Update等方法。
    继承Mono会有一个BUG:
       如果你继承了Mono的类,你就不需要创建它的实例了,但是你不能new创建了,虽然编译可以通过,但是执行的时候就会有个一个错误显示在edit的console窗口,这时候不管你new后面有是否为空,但是系统显示为空,这就是一个BUG了,我的类继承了你,虽然不能new出来,但是怎么会是一个错误呢。
      
    展开全文
  • unity 要在 public class UIQuickLearn : TTUIPage{...} 中使用MonoBehaviour的Update()和OnGUI()实现功能,有什么办法实现? ps:场景只能挂一个脚本
  • 红色框勾选对应继承MonoBehaciour脚本的继承变量enabled enabled 官方解释:启用行为被更新,禁用行为不更新。  即enabled == false 不执行Update函数 enabled == true 执行Update函数   *如果运行前不...
  • MonoBehaviour派生出来的会作为Unity3D中的Component挂载在GameObject上,而GameObject会在编辑器的多个地方被显示,如场景编辑器内、Prefab选中时等,这些时候都需要调用它们的构造函数来初始化成员变量的默认值...
  • Unity3D文档里虽然说所有脚本继承MonoBehaviour类,但如果你想自定义类,就可以不用继承MonoBehaviour,但是这个类只能调用其中的方法和属性,无法拖到场景的物体中使用。 所有从MonoBehaviour继承过来的类,Unity...
  • 让没有继承MonoBehaviour也可以update更新,同一管理Update。 MonoController帧更新:用于实现唯一帧更新 using UnityEngine; using UnityEngine.Events; public class MonoController : MonoBehaviour { //...
  • Unity中,有些继承MonoBehaviour,若想要在这些中使用StartCoroutine,则可以 newGameObject().AddComponent<MonoStub>().StartCoroutine("Test1"); 其中,MonoStub: public class MonoStub : ...
  • 那么创建的都是默认继承MonoBehaviour, 生成后可以查看文件,会发现c#类继承MonoBehaviour, 虽然javascript的前面没有这个继承MonoBehaviour的关键字样,但是默认也是从它继承而来,这是Unity的规定。...
  • UnityEngine.Object.Destroy();
  • 先上Unity官方文档: 有经验的程序员可能会惊讶于没有使用构造函数来完成对象的初始化。这是因为对象的构造由编辑器处理,不会像您可能期望的那样在游戏运行过程开始时进行。如果尝试为脚本组件定义构造函数,将会...
  • Unity继承MonoBehaviour的单利 学习记录 继承于MonoBehaviour的单例,方便调用 /* * FileName: SingletonM * CreateTime: #CreateTime# * Version: #Version# * Description: * */ using System; using...
  • TC_IWeapon 如下所示 using System.Collections.Generic; using UnityEngine; //using System.Collections; public interface TC_IWeapon { List Stat { get; set; } void PerformAttack(); }
  • 问题:有很多初学开发的小朋友发现下载unity后,在unity新建脚本时发现脚本继承MonoBehaviour是还是灰色的,这是因为你在unity中没有把VisualStudio当成默认打开文本的编辑方式。 如图所示 1.打开Edit点击...
  • 单例是开发过程中必不可少的东西。介绍完两个常用单例类型后会介绍一个简单却很实用的MonoEvent。  关于单例的写法网上有很多,这篇文章主要想介绍的是MonoEvent以及为之后的计时器做准备。 1.普通单例  最...
  • 从第一次在unity创建C#脚本开始就会发现每个脚本都继承了一个叫MonoBehviour的,那么MonoBehaviour是做什么的呢? 首先明确一点,Unity引擎将所有的代码的执行都放在了一个主线程中,Update,FixedUpdate等都是...
  • //1.C#中 泛型的知识 //2.设计模式中 单例模式的知识 public class BaseManager<T> where T:new() { private static T instance; public static T GetInstance() { if (instance == null) ......
  • Unity3D中MonoBehaviour类整理类的继承变量函数定时器相关:协程相关:消息:1.代码运行周期:2.动画:3.相机:4.Collider(碰撞体):5.连接服务器:6.鼠标点击:7.其他: 类的继承 继承层次:Object->Component...
  • Unity中的MonoBehaviour

    万次阅读 多人点赞 2019-03-05 22:58:38
    从第一次在unity创建C#脚本开始就会发现每个脚本都继承了一个叫MonoBehviour的,那么MonoBehaviour是做什么的呢? 首先明确一点,Unity引擎将所有的代码的执行都放在了一个主线程中,Update,FixedUpdate等都是...
  • Unity继承MonoBehaviour的静态单例

    千次阅读 2016-10-29 11:15:27
    using UnityEngine;...public class Singleton : MonoBehaviour where T : MonoBehaviour { private static T _instance; private static object _lock = new object(); public static T Instance {
  • UnityMonoBehaviour详解

    千次阅读 2019-03-01 21:07:06
    前言:之前面试被问到生命周期函数是怎么被调用起来的?,当时我只知道生命周期函数的调用顺序,但是完全不知道...先观察一下MonoBehaviour继承关系 Object-&gt;Component-&gt;Behaviour-&gt;MonoBeha...
  • 解决方法链接:https://blog.csdn.net/weixin_39543044/article/details/109593898 在unity的菜单选项中点击Edit--proferenrens--External Tools 然后点击External Script Editor后面的可点击空白区域,选择你的C#...
  • 如果一个继承monobehaviour的,便不能用new来使其实例化,这跟unity3D的编程方式有关,unity3D是组件化编程,除了对象以外一切都是组件(component),所有继承monobehaviour的脚本都要绑定到游戏对象...
  • 继上文,有个蠢货单例模式只是用来引用,突然遇到了一个继承MonoBehaviour,然后unity跟你讲:不!你不可以在我这里这么用! 啊这……吓得我当场百度... **************正文开始************** 第一个脚本 ...
  • Unity 设计模式 之 单例模式(普通型(new)泛型单例 \ 继承 MonoBehaviour 的泛型单例) 目录 Unity 设计模式 之 单例模式(普通型(new)泛型单例 \ 继承 MonoBehaviour 的泛型单例) 一、简单介绍 二、单例...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,421
精华内容 2,568
关键字:

unity继承monobehaviour类