zoukankan      html  css  js  c++  java
  • [原]Unity3D深入浅出

    常用脚本事件:

    Update:每帧调用一次

    Start:在第一次Update执行前调用

    Awake:脚本实例在创建时调用

    FixedUpdate:每个固定物理时间间隔调用一次

    LateUpdate:每帧调用一次,在Update之后

    MonoBehaviour类:

    MonoBehaviour类是uniyt中非常重要的类,定义了基本的脚本行为,所有脚本类均需要从它直接或间接继承。MonoBehaviour还定义了对各种特定事件的响应函数,这些函数名均以On作为开头,下面是一些常用的事件响应函数。

    OnMouseEnter:鼠标移入GUI控件或碰撞体时调用

    OnMouseOver:鼠标停留~~~

    OnMouseExit:鼠标移除~~~

    OnMouseDown:鼠标按下~~~~

    OnMouseUp:鼠标释放~~~

    OnTriggerEnter:当其他碰撞体进入触发器时调用

    OnTriggerExit:~~~~~~~~离开~~~~~~~~

    OnTriggerStay:~~~~~~~停留~~~~~~~~~

    OnCollisionEnter:当碰撞体或者刚体与其他碰撞体或者刚体接触时调用

    OnCollisionExit:~~~~~~~~~~~~~~~~~~~~~~~~离开时~~~

    OnCollisionStay:~~~~~~~~~~~~~~~~~~~~~~~~保持接触时~~~

    OnControllerColliderHit:当控制器移动时与碰撞体发生碰撞时调用

    OnBecameVisible:对于任意一个相机可见时调用

    OnBecameInvisible:对于任意一个相机不可见时调用

    OnEnable:对象启用或者激活时调用

    OnDisable:对象禁用或者取消激活时调用

    OnDestory:脚本销毁时调用

    OnGUI:渲染GUI和处理GUI消息时调用

    脚本和组件交互:

    一个对象由若干个组件组成,通常需要利用脚本来访问对象的各种组件并设置组件的参数。对于系统内置的常用组建,Unity提供了非常便利的访问方式,只需要在脚本里访问组件对应的成员变量即可,这些成员变量定义在MonoBehaviour中并被脚本继承了下来。

    常用组件以及对应的变量如下。

    组件名称 变量名 组件作用
    Tranform tranform 设置对象的位置,旋转,缩放
    Rigidbody rigidbody 设置物理引擎的刚体属性
    Renderer renderer 渲染物体模型
    Light light 设置灯光属性
    Camera camera 设置相机属性
    Collider collider 设置碰撞体属性
    Animation animation 设置动画属性
    Audio audio 设置声音属性

    注意:如果对象上不存在某组件,则返回null。

    访问不属于商标中列出的组件,或者是访问对象上的脚本(脚本属于自定义组件),通过如下方式访问来得到组件的引用:

    GetComponent :得到组件

    GetComponents:得到组件列表

    GetComponentlnChildren:得到对象或对象子物体上的组件

    GetComponentsInChildren:得到对象或对象子物体上的组件列表

    注意:这几个函数都比较耗时,因此一般不要在Update函数中使用,应该在外部定一个接受组件引用的对象,在Start函数中使用GetComponent函数来获取组件引用。

    示例:在一个cube里有一个move.cs脚本,在move.cs脚本中获cube的Tranform组件

    Tranform c_tranform;
    Move move;
    void Start(){   //第一种方式   c_tranform = tranform;   //第二种方式   c_tranform = GetComponent<Transform>();

    move = GetComponent<Move>(); }
    void Update{ }

    访问场景中的对象:

    在unity3d开发中,脚本不但需要访问脚本所在对象的组件,还经常需要访问其他的对象:

    1.通过名称来查找:使用函数GameObject.Find,如果场景中存在指定名称的对象,则返回该对象的引用,否则返回null,如果存在多个同名的对象,则返回第一个对象的引用。

    GameObject cube = GameObject.Find("MyCube");

    2.通过标签来查找:GameObject.FindWithTag,如果场景中存在指定标签的对象,则返回该对象的引用,否则返回null,如果多个对象使用同一个标签,则返回第一个对象的引用。

    注意:与GetComponent一样,GameObject.Find和GameObject.FindWithTag也是比较耗时的参数,因此不建议在update函数中调用它们,而是在初始化中查找一次后保存在变量中。

    协同程序(Coroutine):

    Coroutine也成为协同程序协程,可以和主程并行运行,和多线程类似,但是在任一制定时刻只会有一个协同程序在运行,别的协同程序则会挂起。可以用来实现让一段程序等待一段时间后继续运行的效果。

    协同程序(Coroutine)的相关函数如下:

    • StartCoroutine:启动一个协同程序
    • StopCoroutine:停止一个协同程序
    • StopAllCoroutine:终止所有协同程序
    • WaitForSeconds:等待若干秒。
    • WaitForFixedUpdate:等待知道下一次FiexdUpdate调用。

    javascript示例:

    function Start()
    {
        print("starting "+Time.time);
        yield WaitAndPrint();//启用一个协同程序
        print("done "+Time.time)  
    }
    
    function WaitAndPrint()
    {
        yield WitForSeconds(5);//等待5s
        print("waitandprint "+Time.time)
    
    }

    C#示例:

    IEnumerator Start () {
            Debug.Log("等待5s "+Time.time);
            yield return StartCoroutine(WaitMethod());
    }
    
    IEnumerator WaitMethod()
    {
            yield return new WaitForSeconds(5f);
            Debug.Log("已经等待5s "+Time.time);
    }

    这里注意,C#中的协同函数的返回类型必须为IEnumerator,yield要用yield return来替代,并且启动协程用StartCoroutine()函数。

  • 相关阅读:
    修复 XE8 for Android 方向传感器 headingX,Y,Z 不会动的问题
    修复 XE8 for Android 分享图片到 Gmail 权限不足的问题
    Firemonkey 载入 Style 皮肤 (*.fsf 二进制文件) 速度测试
    调整 FMX Android 文字显示「锯齿」效果
    [原创工具] ListView 调色盘 (Free)
    有关Linux的可执行程序
    Android 下配置一个 /dev/fb0 节点出来
    Android下运行Linux可执行程序
    数据库的范式
    rk3128 适配 USB 摄像头
  • 原文地址:https://www.cnblogs.com/tonge/p/3934732.html
Copyright © 2011-2022 走看看