精华内容
下载资源
问答
  • MonoBehavior

    2018-03-06 19:04:26
    MonoBehavior属性:1. enabled:激活的行为会被更新,而禁用的行为则不会。2. isActiveAndEnabled:该行为是否启用了调用。3. gameObject:这个组件附加到游戏对象。一个组件总是连接到一个游戏对象。4. tag:这...

    MonoBehavior

    属性:

    1. enabled:激活的行为会被更新,而禁用的行为则不会。

    2. isActiveAndEnabled:该行为是否启用了调用。

    3. gameObject:这个组件附加到游戏对象。一个组件总是连接到一个游戏对象。

    4. tag这个游戏物体的标签

    5. transform这个游戏物体的transform

    6. runInEditMode:允许单行为的特定实例以编辑模式运行(仅在编辑器中可用)

    7. useGUILayout:禁用它可以让您跳过GUI布局阶段。

    8. hideFlags:该对象是否应该被隐藏,被场景保存或被用户修改?

    9. name这个对象的名字

    公共方法:

    1. BroadcastMessage在他的子对象中调用为这个名字的函数

    2. CompareTag比较标签

    3. GetComponent:如果游戏对象有一个附加的,则返回类型类型的组件,如果没有,则返回null

    4. SendMessage:在这个游戏对象的每一个单行为上调用名为methodName的方法。

    5. SendMessageUpwards:调用这个方法的方法名,在这个游戏对象的每一个单行为上,并且在行为的每个祖先上。

    Invoke:在秒内调用方法methodNameInvoke("LaunchProjectile", 2);

    6. CancelInvoke:取消所有对该单行为的调用。

    InvokeRepeating:在时间秒内调用方法methodName,然后重复每一个重复的秒数。InvokeRepeating("LaunchProjectile", 2.0f, 0.3f);2s开始调用,没0.3s在调用一次

     

    7. IsInvoking:是否有在调用?(!IsInvoking(“method”));

    8. StartCoroutine开始协成

    9. StopAllCoroutines开始所有协成

    10. StopCoroutine停止协成StopCoroutineCoroutineName);

    静态方法

    1. print:打印 效果等同于debug.log

    2. Destroy:销毁游戏物体,组件或者asseet。需要指定时间

    Instance:生成游戏物体

    public static Object Instantiate(Object original);

    public static Object Instantiate(Object originalTransform parent);

    public static Object Instantiate(Object originalTransform parent, bool instantiateInWorldSpace);

    public static Object Instantiate(Object originalVector3 positionQuaternion rotation);

    public static Object Instantiate(Object originalVector3 positionQuaternion rotationTransform parent);

    instantiateInWorldSpace当指定父对象来维护对象的世界位置时,而不是设置相对于新父对象的位置时,传递true。通过false来设置对象相对于它的新父对象的位置。

    已经写好,有固定用处的方法

    1. Awake当脚本被加载的时候调用

    FixedUpdateMonoBehaviour启用时,其 FixedUpdate在每一帧被调用。

            处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)

     

    2. LateUpdate 当Behaviour启用时,其LateUpdate在每一帧被调用。
            LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。

    3. UpdateMonoBehaviour启用时,其Update在每一帧被调用。

    4. OnAnimatorIK

    5. OnAnimatorMove

    6. OnBecameInvisible:当渲染器不再被任何相机显示时,就会调用。

    7. OnBecameVisible:当渲染器在任何摄像机中可见时,就会调用OnBecameVisible

    8. OnCollisionEnter2D)(Stay/Exit);

    9. OnConnectedToServer在连接到server上市调用

    10. OnControllerColliderHitOnControllerColliderHit是当控制器在执行动作时撞到一个碰撞器时被调用的。

    11. OnDestroy当被销毁的时候调用

    12. OnDisable:当行为变为禁用(Disable())或非活动时,将调用此函数。

    13. OnDisconnectedFromServer:当连接丢失或断开与服务器的连接时,调用客户端。

    14. OnEnable:当对象启用和激活时调用此函数。

    OnFailedToConnect

    Called on the client when a connection attempt fails for some reason.

    OnFailedToConnectToMasterServer

    Called on clients or servers when there is a problem connecting to the MasterServer.

    15. OnMouseDownDrag/Enter/Exit/Over/Up/UpAsButton(只在鼠标在相同的GUIElementCollider上被按下时才被调用。))

    16. OnNetworkInstantiate调用被实例化的网路实例

    17. OnParticleCollisionTrigger/Connected/Disconnected/当粒子效果撞到碰撞器/触发器时候调用(当玩家连接到/失联到服务器是调用)

    18. OnTransformChildrenChanged:当游戏对象的转换子列表发生变化时,调用此函数。

    19. OnTransformParentChanged:当游戏对象转换的父属性发生变化时,调用此函数。

    展开全文
  • MonoBehavior lifecycle

    2019-10-04 21:04:13
    编辑状态,什么都不执行 2 点play之后, Awake, OnEnble, Start 3 stop后, OnDisable, Destory ### 泄露 动态创建一个材质(material)后,不添加到任何一个渲染对象身上, 被称为leaked 使用hideFlags material...
    awake 只调用一次, awake在所有obj都初始化之后被调用.
          用途:
            初始化游戏状态
              设置脚本间的引用
              
    
    ### ExecuteInEditMode 编辑模式下
    ```
    这个模式下,脚本编译,会自动reload
    
    [ExecuteInEditMode]
    public class LifecycleTest : MonoBehaviour {}
    
    When new component (this script) is added: Awake(), OnEnable(), Reset(), Start()
    When scene is saved (CTRL+S): nothing happens but here you may see those irritating info messages
    When scene is unloaded: OnDisable(), OnDestroy()
    When scene is loaded: Awake(), OnEnable(), Start()
    When script is modified: OnDisable(), OnEnable()
    ```
    
    Awake - OnDestory
    OnEnable - OnDisable
    
    Awake只执行一次, 
    OnEnable OnDisable会执行多次(reload script的时候), awake里初始化的实例将会丢失(如果没有重新加载场景的话), 报错NullReferenceExceptions
    
    ### 游戏模式
    1 编辑状态,什么都不执行
    2 点play之后, Awake, OnEnble, Start
    3 stop后, OnDisable, Destory
    
    
    
    ### 泄露
    动态创建一个材质(material)后,不添加到任何一个渲染对象身上, 被称为leaked
    
    使用hideFlags
     material.hideFlags = HideFlags.DontSave;
     一定要这样删除
     DestroyImmediate(HideFlags)
     

    转载于:https://www.cnblogs.com/lightlfyan/p/4236271.html

    展开全文
  • MonoBehavior的调用优化

    千次阅读 2017-04-28 17:32:33
    MonoBehavior的调用优化 如果告诉你,Unity由于调用你的MonoBehaviour函数而造成CPU性能大量浪费?真的与你的脚本无关么?若你有成千上百个呢,你应该了解一个新的优化领域。魔术技巧 MonoBehaviour函数调用缓慢。...


    本文章由cartzhang编写,转载请注明出处。 所有权利保留。
    文章链接:http://blog.csdn.net/cartzhang/article/details/70921049
    作者:cartzhang

    本文同步与游戏蛮牛。

    MonoBehavior的调用优化


    如果告诉你,Unity由于调用你的MonoBehaviour函数而造成CPU性能大量浪费?真的与你的脚本无关么?若你有成千上百个呢,你应该了解一个新的优化领域。

    魔术技巧


    MonoBehaviour函数调用缓慢。我们谈论的是像Update(),LateUpdate(),OnRender()等函数。这里所谓的魔术技巧,若你熟悉面向对象语言编程,这个概念就像是使用反射机制(反射让你即使不知道接口也可以调用方法)。反射的调用非常消耗,所以unity尽可能的缓存任何操作,这样所需要的CPU指令集来每帧调用魔术方法就可能很少。但是,依旧很慢,很慢…

    为什么这么慢啊?


    我不打算讨论具体细节(若真需要了解细节,可以阅读文章后面的链接)(译者注:反射原理),所以只想象Unity试图尽可能的灵活和易用。制造一些容易的东西容易增大CPU功耗,因为引擎不能假设你要做的游戏,它需要做很多检测来保证魔法函数被正确对象以正确顺序调用,且不能崩溃。

    可以更快么?


    这是我最喜欢的部分了。是的,当然可以!怎么做呢?你需要通过自定义的函数,并负责从一个管理器中调用Update()函数。这样一来,自己负责更新对象。会有多快呢?这个取决有平台。让我们使用Valentin Simonov在Unity官方博客上做的对比:

    image

    这里你可以看到不同的时间消耗。这个是测试了调用Update 10000次的结果。

    写一个管理器


    将介绍一个简单例子,一个名为BoxManager的管理器,用来管理被管理的脚本。
    管理器有两个职责:

    保持管理对象的列表已更新,
    当管理器Update()被调用时,调用受管对象类的更新功能。

    代码可能如下所示:

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class BoxManager : MonoBehaviour
    {
        public static BoxManager Instance { get; private set; }
    
        public List<BoxManaged> _managedBoxes = new List<BoxManaged>();
    
        void Awake()
        {
            Instance = this;
        }
    
        void Update()
        {
            // update objects here
        }
    
        public void Register(BoxManaged box)
        {
            _managedBoxes.Add(box);
        }
    
        public void Unregister(BoxManaged box)
        {
            _managedBoxes.Remove(box);
        }
    }


    如你所见,它看起来很简单。在使用Update函数之前,我们看看BoxManaged.cs。

    using UnityEngine;
    
    public class BoxManaged : MonoBehaviour {
    
        private Vector3 _position;
    
        private Transform _transform;
    
        void OnEnable()
        {
            BoxManager.Instance.Register(this);
        }
    
        void OnDisable()
        {
            BoxManager.Instance.Unregister(this);
        }
    
        public void ManagedUpdate()
        {
            // do what you normally do in Update here
        }
    }


    当可以使用和被禁用的时候都会自动注册。很公平,ManagedUpdate()函数代替Update()这个魔法函数。我们来实现BoxManager.Update(),这样它就会立刻调用所有的BoxManaged.ManagedUpdate()。

    void Update()
    {
        for (int i = 0; i < _managedBoxes.Count; ++i)
        {
            _managedBoxes[i].ManagedUpdate();
        }
    }


    就是这样。真的!现在你可以在ManagedUpdate()中实现你平时在Update()中处理的任何内容。

    请注意,我并没有使用foreach来迭代。首先,因为在unity的Mono版本中它会产生少量的GC垃圾。其次,它看起来似乎较慢。(译者注:在Unity5.5 beta后就不是问题了)

    我该在意这个么?


    这取决于你的游戏类型和目标平台。问下自己——你有很多MonoBehaviour对象调用Update()么?它不一定需要Update(),它可以是每帧调用的任何对象。然后,若针对的是移动平台,绝对值得一试!单机平台?依旧值得考虑,尤其是你有大量的对象。

    尽管你的对象数量较少,有时候你可能还是需要一个管理器。在IOS上(我不知道是否已经修复)OnRender()函数有问题。在30-40个对象可能会让游戏的性能降低两倍!解决方案?像上面提到的管理器,不是调用Update(),而是OnRender()代码。是的,效果很明显。

    请记住,这是您可以使用的许多优化策略之一。 然而,这一个很隐蔽 - 除非你知道,否则你将很难找到这个。 这就是为什么这篇文章产生的原因。

    参考

    https://blogs.unity3d.com/2015/12/23/1k-update-calls/

    原帖地址:http://blog.theknightsofunity.com/monobehavior-calls-optimization/
    作者:The Knights of Unity


    蛮牛地址:http://manew.com/forum.php?mod=viewthread&tid=103317&page=1&extra=#pid1417941


    若有问题,请随时联系!!
    感谢浏览,欢迎点赞!

    展开全文
  • uLua拆分MonoBehavior逻辑

    千次阅读 2015-08-16 22:34:41
    既然是项目后期想用uLua,自然有不少代码需要改造,我看了一下最简单的就是先从MonoBehavior开始改造。项目中有不少直接挂在GameObject上的,其中的逻辑相对比较独立,就先从这个开始试一下。 实验用的脚本长这样:...

      最近项目准备用uLua实现部分代码热更新。于是去了解了一下uLua的使用方法。既然是项目后期想用uLua,自然有不少代码需要改造,我看了一下最简单的就是先从MonoBehavior开始改造。项目中有不少直接挂在GameObject上的,其中的逻辑相对比较独立,就先从这个开始试一下。

      实验用的脚本长这样:

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class MonoBeh : MonoBehaviour {
    
        // Use this for initialization
        public List<Transform> gameObjects;
        public float rotateSpeed = 90.0f;
        void Start () {
    
        }
    
        // Update is called once per frame
        void Update () {
            for (int idx = 0; idx < gameObjects.Count; ++idx)
            {
                gameObjects[idx].Rotate(0, Time.deltaTime * rotateSpeed, 0);
            }
        }
    }

      代码很简单,就是让列表里面的物体一直转转转~

      要使用uLua,首先要从uLua官网下载uLua的Unity插件,目前的版本是1.2.1,需要注意的是uLua在旧版本的Unity运行会有问题,会把Unity直接整崩掉,所以最好升级到4.6.2以上的Unity再用。

      使用uLua的目的是把容易变动的逻辑部分作为Lua脚本嵌入项目,以后这些脚本就可以像普通资源一样通过AssetBundle实现热更新了。要使用Lua脚本,需要用LuaScriptMgr对象,调用DoString方法就可以执行Lua脚本了。下面是改造后的MonoBehavior代码:

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using LuaInterface;
    
    public class MonoBeh2 : MonoBehaviour {
        public TextAsset luaScript;
        public List<Transform> gameObjects;
        public float rotateSpeed = 90.0f;
        private LuaScriptMgr mgr;
        private LuaFunction funUpdate;
        private LuaFunction funSetGameObjects;
        private LuaFunction funSetSpeed;
        // Use this for initialization
        void Start () {
            mgr = new LuaScriptMgr();
            mgr.Start();
            if (luaScript != null)
            {
                mgr.DoString(luaScript.text);
                funUpdate = mgr.GetLuaFunction("logic.Update");
                funSetGameObjects = mgr.GetLuaFunction("logic.SetGameObjects");
                funSetSpeed = mgr.GetLuaFunction("logic.SetRotateSpeed");
    
                if (funSetGameObjects != null)
                {
                    funSetGameObjects.Call((object)gameObjects.ToArray());
                }
                if (funSetSpeed != null)
                {
                    funSetSpeed.Call((double)rotateSpeed);
                }
            }
        }
    
        // Update is called once per frame
        void Update () {
            if (funUpdate != null)
            {
                //fun.Call(这里参数不会写)
                funUpdate.Call((double)Time.deltaTime);
            }
        }
    
        void OnDestroy()
        {
            if (funUpdate != null)
            {
                funUpdate.Release();
            }
            if (funSetGameObjects != null)
            {
                funSetGameObjects.Release();
            }
            if (funSetSpeed != null)
            {
                funSetSpeed.Release();
            }
        }
    }
    

      这样我们就把Update中做核心工作的代码拿了出去,放到了luaScript中。Lua中的脚本是这样的:

    logic = logic or {}
    logic.gameObjects = gameObjects or {}
    logic.rotateSpeed = 0
    
    
    function logic.SetGameObjects(objects)
        for i = 0, objects.Length - 1, 1 do
            if logic.gameObjects[i] == nil then
                logic.gameObjects[i] = objects[i]
            end
        end
        print "Call Fun:SetGameObjects"
    end
    
    function logic.SetRotateSpeed(speed)
        logic.rotateSpeed = speed
        print "Call Fun:SetRotateSpeed "
    end
    
    function logic.Update(deltaTime)
        for i, v in next, logic.gameObjects do
            v:Rotate(0, logic.rotateSpeed * deltaTime, 0)
        end
    end

      Unity中的类已经通过uLua生成的xxxWrap.cs的代码引入到Lua中了,所以我们可以直接用,但是我们自己的数据是需要自己传给Lua的,这里我用了两个Set方法。另外需要说的一点是Lua中不能直接用Time.deltaTime,这个值始终是0,所以我在Update里面手动传入了这个值,也可能是我用的方式不对吧,如果有知道怎么用的欢迎交流。总之,作为一次实验性的探索,代码还是写的比较丑的,毕竟只是想先学会用。

    展开全文
  • 原文链接: http://blog.shuiguzi.com/2014/11/10/MonoBehavior%20event%20functions/ 写在最前面 ...MonoBehavior是Uniy3d脚本编写核心的类之一, 它预先定义好了很多事件,并且这些事件按照预先定义
  • 首先展示一下几种Monobehavior的执行顺序。 几种Update的区别 Update: 每隔一段时间执行依次,但是隔的时间是不固定的。可能因为更新过程中执行的内容执行时间长度不同等各种原因产生差异 Fixedupdate: 每次...
  • Unity中的MonoBehavior

    2021-05-27 20:49:01
    Unity中的MonoBehavior类,声明了游戏循环中的各类回调函数。MonoBehaviour 是一个基类,所有 Unity 脚本都派生自该类。 使用 C# 时,必须显式派生自 MonoBehaviour。 最重要的回调函数有:Awake、Start、Update、...
  • “尽量避免使用MonoBehavior”,这显然是不对的。 本科阶段我们就学习过设计模式,即良好的程序要尽可能提高聚合性,降低耦合性。而巨量的MonoBehavior有大概率是会大大拉低聚合性,并使逻辑缠绕在一起提高耦合性的...
  • GameObject、MonoBehavior

    2020-03-01 11:58:32
    还有MonoBehavior(Inherited members 继承)中的Variables:gameObject、transform、tag、name、isActiveAndEnabled、enabled=true/false等;Public Functions:GetComPonent、GetComPonents、GetComPonentInChildren...
  • MonoBehavior调用的优化方案 本帖最后由 204有个大坑 于 2017-5-31 18:00 编辑 假如我告诉你Unity仅仅在调用MonoBehaviour函数的时候就非常浪费资源,你会怎么想?并且与你的脚本具体在做的事没有关系。如果你有上百...
  • MonoBehavior常用函数
  • Unity事件响应知识体系图: 知识体系图绘制的根据为极客学院的Unity教程,视频学习地址(该视频为免费学习视频): https://www.jikexueyuan.com/path/unity3d ......
  • Monobehavior生命周期函数表网上都有,这里只研究经常遇到的,重点关注FixedUpdate、Update、LateUpdate与OnGUI public class MonoLifeTest : MonoBehaviour { private void Awake() // 最先调用,只调用一次,只...
  • 这篇文章其实是 记MonoBehavior与单例模式碰撞的火花的后续篇。可以读一下,可以更好的理解本文。 众所周知,继承MonoBehavior的子类是不能使用new来实例化的。但是如果我们强行new一下呢? using System....
  • 实现3个功能: 1. MonoBehavior的执行顺序 2. 碰撞事件 3. 鼠标事件
  • 继承MonoBehavior的永久单例类的实现 using System.Collections; using System.Collections.Generic; using UnityEngine; //继承MonoBehavior的单例 public class TMonoSingleton<T> : MonoBehaviour where T...
  • 关于Unity脚本继承MonoBehavior类失败解决方案 是因为外部编辑器没有设置为VS,在Unity中点击Edit—>preference—>external tool—>external Script Edit改为VS。
  • Unity MonoBehavior 一个类继承了MonoBehaviour就不能通过 new 的方式生成对象,可以通过挂在GameObject身上通过Find()获得 警告信息:You are trying to create a MonoBehaviour using the 'new' keyword. ...
  • 【转】Unity3d中MonoBehavior默认函数的执行顺序和生命周期 原网址https://blog.csdn.net/cxihu/article/details/47049355 Awake()在MonoBehavior创建后就立刻调用,在脚本实例的整个生命周期中,Awake函数仅执行一...
  • 这几天写代码遇到一个很奇怪的bug(有不奇怪的bug吗),简单的说就是某个事件会重复触发。经过层层debug、把原来的代码精简精简再精简,终于...倘若我在多问一下平台有什么差异,我就会发现Mono以及MonoBehavior了。
  • 请保留博主链接:http://blog.csdn.net/andrewfan3.2MonoBehavior 组件父类重构为了让我们的组件类用起来更方便,我们将上一节的代码进行重构。改写成如下:[csharp] view plain copyusing UnityEngine; using...
  • Unity日出日落 MonoBehavior可更改场景的光强度以模拟日出和日落。
  • Unity使用JsonUtility反序列化的时候,如果对象继承自MonoBehavior或者ScriptableObject,使用JsonUtility.FromJson的时候,会报这种错 JsonUtility ArgumentException: Cannot deserialize JSON to new instances ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,628
精华内容 651
关键字:

monobehavior是什么