美文网首页
Unity3D疯狂教室案例开发[上](十五)

Unity3D疯狂教室案例开发[上](十五)

作者: TonyWan_AR | 来源:发表于2016-12-16 18:41 被阅读259次

    本节要点

    #1.模型旋转实现开门效果
    
    1.模型中心点
    
    模型身上的坐标轴的中心点,也就是我们模型的中心点。
    
    模型的的位置,旋转,缩放都是相对于模型的中心点来进行变化的。
    
    2.改变模型中心点
    
    
    创建一个空物体,创建父子关系,通过父物体来控制子物体。
    
    也就间接的改变了模型的中心点。
    
    3.中心点工具
    
    Center:当选中两个模型的时候,设置为“Center”,模型组的中心点就在
    
    两个模型的中间中心位置。
    
    Pivot:当选中两个模型的时候,设置为“Pivot”,模型组的中心点就在后选
    
    中的模型的中心点位置。
    
    4.使用键盘按键实现开关门
    
    使用 Transform.Rotate(Vector3,float)旋转模型:
    
    Vector3:沿某个轴向旋转
    
    Float:旋转的度数
    
    
    #2.触发器实现开关门
    
    1.添加触发器
    
    ① 创建一个空物体,添加“Box Collider”组件,并设置大小和中心点;
    
    ② 将“Box Collider”勾选“Is Trigger”变成触发器;
    
    
    2.代码实现触发器开关门
    
    OnTriggerEnter()
    
    OnTriggerExit()
    
    
    3.查找游戏物体
    
    GameObject.Find(string):[静态方法] 通过名字查找游戏物体
    
    String 游戏物体的名字
    

    场景视图

    关键代码

    StudentMove

    public class StudentMove : MonoBehaviour {
    
        private Transform m_Transform;
    
        // Use this for initialization
        void Start () {
    
            //获取相应组件的引用,声明同类型字段去接收
            m_Transform=gameObject.GetComponent<Transform>();
        }
        
        // Update is called once per frame
        void Update () {
        
            //移动物体位置的关键语句
          //  m_Transform.Translate(Vector3.forward*0.1f,Space.World);
            //参数1:Vector3移动物体的三维变量(枚举类型),表示x,y,z;Space参数2:移动物体的坐标系(枚举类型)自身坐标系或世界坐标系
            //0.1f 表示将当前速度下调到原来十分之一;切记加上f
    
            //获取相应键控制方向;w a s d
            if (Input.GetKey(KeyCode.W))
            {
                m_Transform.Translate(Vector3.forward*0.1f,Space.World);//往前
            }
    
            if (Input.GetKey(KeyCode.S))
            {
                m_Transform.Translate(Vector3.back * 0.1f, Space.World);//向后
            }
    
            if (Input.GetKey(KeyCode.A))
            {
                m_Transform.Translate(Vector3.left * 0.1f, Space.World);//向左
            }
    
            if (Input.GetKey(KeyCode.D))
            {
                m_Transform.Translate(Vector3.right * 0.1f, Space.World);//向右
            }
    
    
        
        }
    }
    
    

    Door

    public class Door : MonoBehaviour {
    
    
        private Transform m_Tranform;
    
        // Use this for initialization
        void Start () {
        //tranform 必须有获取相应组件 GetComponent 关键语句; 
            m_Tranform=gameObject.GetComponent<Transform>();
        }
        
        //测试用Z键打开门和关闭门
        // Update is called once per frame
        //void Update () {
    
        //    if (Input.GetKeyDown(KeyCode.Z))
        //    {
        //        //open.
        //        OpenDoor();
    
        //    }
    
        //    if (Input.GetKeyUp(KeyCode.Z))
        //    {
        //        //Close;
        //        CloseDoor();
        //    }
        
        //}
    
        //打开门公开方法
       public  void OpenDoor() {
    
            m_Tranform.Rotate(Vector3.up,90);
    
        
        }
    
        //关门的公开方法
      public   void CloseDoor() {
    
    
            m_Tranform.Rotate(Vector3.up,-90);
            
        }
    
    
        //勾选 Is Trigger 转换成触发器 否则只是碰撞体
    }
    
    

    DoorTrigger

    public class DoorTrigger : MonoBehaviour {
    
    
        //定义一个脚本的类型;
    
        private Door m_Door;
        // Use this for initialization
        void Start()
        {
            //GameObject.Find("DoorParent") 这语句就是获取相应的gameobject 字段或属性
            //GetComponent<Door>();获取相应组件 可以是脚本或者是Transform
            //GameObject.Find("DoorParent") 类的静态方法 参数是游戏对象的名字 最后返回的事游戏的对象
            m_Door=GameObject.Find("DoorParent").GetComponent<Door>();
    
        }
    
        // Update is called once per frame
        //void Update()
        //{
    
        //}
    
        //触发时执行一次开门
        void OnTriggerEnter(Collider coll ) { 
        
        //Open.
            if (coll.gameObject.name=="Student")
            {
                m_Door.OpenDoor();
            }
        
        }
    
    
        //离开触发器时执行一次关门
        void OnTriggerExit(Collider coll) { 
        //Close.
            if (coll.gameObject.name=="Student")
            {
                m_Door.CloseDoor();
            }
        
        }
    
    
    }
    
    

    小结

    Unity API.png

    相关文章

      网友评论

          本文标题:Unity3D疯狂教室案例开发[上](十五)

          本文链接:https://www.haomeiwen.com/subject/rydnmttx.html