zoukankan      html  css  js  c++  java
  • [Unity菜鸟] 笔记2 —— 问题篇

    记录在学习《Unity 3.x 游戏开发 经典教材》时遇到的各种问题与笔记

    1. 初始不能降低Terrain的高度,需要到Terrain设置的第二个按钮中将Height从0调高

        (注意:最右边齿轮按钮里的Terrain Height是整个地形的最大高度,左图是当前笔刷绘制的最大高度)

       

    2. SendMessage() 可以直接调用物体中的一个函数,而不在乎函数属于哪个脚本

    // ① 书中P151
    currentDoor.SendMessage("DoorCheck");
    //此处,SendMessage()函数检查在currentDoor变量所保存的物体的所有脚本中是否存在一个名为 DoorCheck()的函数,如果找到了,就调用该函数
    
    
    
    // ② 官方示例
    // Calls the function ApplyDamage with a value of 5
    gameObject.SendMessage ("ApplyDamage", 5.0);
    	
    // Every script attached to the game object 
    // that has an ApplyDamage function will be called.
    function ApplyDamage (damage : float) 
    {
          print (damage);
    }
    

     

    3. 碰撞检测 

        OnControllerColliderHit() 这个函数的脚本不能随便绑定,要绑定到有角色控制器的对象上,比如Player

        CharacterController.OnControllerColliderHit 控制碰撞器碰撞

        缺陷:

              ◇ 代码被放到玩家物体中,随着不断完善代码,整个脚本会变得越来越庞大,难以维护

              ◇ 使用拓展后的碰撞器来激活门状态的改变,这样玩家会突然撞到一面无形的墙,从而突然停下移动的脚步,这一点影响了游戏可玩性

    4. Collidion  Trigger 碰撞 和 触发

        要使用Trigger检测物体进入,则需要勾选Is Trigger选项。否则物体就会被挡在碰撞区外,无法进入。

        碰撞检测触发器Trigger 有别于碰撞检测器 Collision,其可以不受物理效果影响,一些可穿透区域的碰撞检测,可以使用Trigger来进行碰撞检测。

     Trigger例子:

    // 进入碰撞区域,触发canThrow = true
    void OnTriggerEnter(Collider col)
        {
            if (col.gameObject.tag == "Player")
            {
                CoconetThrower.canThrow = true;
            }
        }
    
    // 离开碰撞区域,触发canThrow = false
        void OnTriggerExit(Collider col)
        {
            if (col.gameObject.tag == "Player")
            {
                CoconetThrower.canThrow = false;
            }
        }

        跟 OnTriggerEnter() 函数不同,OnCollisionEnter() 函数处理的是原型碰撞器之间的普通碰撞,也就是说,没有角色控制器碰撞器和处于触发模式的碰撞器。

        在这个函数中,参数theObject是一个Collision类的实例,这样的一个实例保存着关于速率、刚体、碰撞器、变换、游戏物体的信息,另外还有碰撞发生时的接触点。

       Collision 例子:

    5. AudioSource.PlayClipAtPoint()   

        这个命令生成一个带有音频源的临时物体,播放完音乐之后移除自己。

        AudioSource.PlayClipAtPoint(testSound,transform.position);

      testSound 音频源, transform.position 播放的位置

     

    6. Instantiate 实例化

        public Rigidbody coconutPrefab;  //发射的椰子预设
        public float throwSpeed = 30f;    //发射速度
    
        void Update () 
        {
            if (Input.GetButtonDown("Fire1") )
            {
                Rigidbody newCoconut = Instantiate(coconutPrefab, transform.position, transform.rotation) as Rigidbody; //克隆椰子
                //newCoconut.name = "coconut";    //重命名克隆物体
                newCoconut.velocity = transform.forward * throwSpeed; //方向和throwSped相乘,从而给刚体物体一个速率
    
                Physics.IgnoreCollision(transform.root.collider, newCoconut.collider, true);   //防止椰子实例化的时候和角色发生碰撞
            }
    	}
    

    7. Destroy

        Destory(需要被移除的物体或者组件,多长时间后执行此移除函数);

    // 编写以下脚本,并直接绑定到“椰子”预设上,生成的“椰子”克隆体就会在3秒后自动被删除,以此来减小游戏的开销。
        void Start () 
        {
            Destroy(gameObject, 3);
        }
    

      

    8. 数组越界问题

        public Vector3[] dalou_correct ;   //大楼正确的位置
        public Vector3[] chuang_correct ;  //窗户正确的位置
    // 如果在这里定义成 public Vector3[] dalou_correct = new Vector3[14]; 
    // 在下面调用chuang_correct[0] 就会报错超出数组界限
    	void Start () 
        {
            chuang_correct = new Vector3[14];
            dalou_correct = new Vector3[15]; 
    
            dalou_now = GameObject.Find("DALOU");
            chuang_now = GameObject.Find("windows");
            cameraVir.gameObject.SetActive(false);
    
            Debug.Log(chuang_now.transform.childCount);
    
            //先记录正确的位置
            for (int i = 0; i < chuang_now.transform.childCount; i++)
            {         
                chuang_correct[i] = chuang_now.transform.GetChild(i).transform.position;          
            }
    
            for (int j = 0; j < dalou_now.transform.childCount; j++)
            {
                dalou_correct[j] = dalou_now.transform.GetChild(j).transform.position;
            }
    

     

    9. 透明 问题

    参考

    10. NGUI如果用SetActive(false)隐藏面板,当它上面还有正在执行的协程时就会报错

          可以用UIPanel.alpha=0来隐藏

    11. start函数只会执行一次,如果一个Cube上有start函数,在另一个物体上控制Cube.SetActive(false),再Cube.SetActive(true)

         此时Cube再次激活时,Start函数不会被执行

    12. 数组本身是引用传递,但是数组元素可以是值传递,不要直接记录原来的Transform数组,用Transform记录position是保存不了值的,用Vector3数组去记录position就可以了

  • 相关阅读:
    <html>
    小贝_mysql 触发器使用
    windows能连网络,可是打不开网页,出现无法解析server的DNS
    POJ 3268 Bookshelf 2 动态规划法题解
    Artistic Style在windows下的使用(C/C++)
    ASP.NET CS文件中输出JavaScript脚本的3种方法以及区别
    跨浏览器的本地存储解决方案
    JavaScript Array 对象扩展方法
    JavaScript String 对象扩展方法
    jQuery开发技巧
  • 原文地址:https://www.cnblogs.com/code1992/p/3760550.html
Copyright © 2011-2022 走看看