U3d开发个人总结

1.  坐标系的分类和转化:

  1. — World Space(世界坐标):标准的D3D左手坐标系,旋转方向是左手法则包括法向量方向,背面剔除逆时针的。我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在transform.position可以获得该位置坐标。例如:MainCamera的坐标系是  (0,0,-10);

      2. — Screen Space(屏幕坐标,鼠标坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),

  3. — 绘制GUI界面的坐标系或NGUI:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。

  4. — ndc space, ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,屏幕中心为[0.5,0.5],z值保留了透视投影中的正值但是值的大小是世界坐标系的值。不同于D3D中的[-1,-1,0]到[1,1,1],也不同于OGL中的[-1,-1,-1]到[1,1,1]。

  

  世界坐标→屏幕坐标:

  camera.WorldToScreenPoint(transform.position);

  屏幕坐标→世界坐标

  camera.ScreenPointToWorld(transform.position);

  屏幕坐标→视口坐标:

  camera.ScreenToViewportPoint(Input.GetTouch(0).position);  这样可以将屏幕坐标转换为视camera为场景中的camera对象。

  视口坐标→屏幕坐标:

  camera.ViewportToScreenPoint();

  视口坐标→世界坐标:
  camera.ViewportToWorldPoint(); 

 

2.  坐标获取(鼠标点击或者手指触摸位置点的坐标)

   世界坐标点(3d游戏三维坐标)

    通过射线技术获取三维坐标,代码如下:

      Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
      RaycastHit hit;
      if (Physics.Raycast (ray, out hit))

       {
         //碰撞信息保存在hit中,如:
         //hit.point 碰撞点
         //hit.collider.gameObject //碰撞对象
       }

     

  屏幕坐标点(平面游戏二位坐标)

    Input.mousePosition

 

 3. U3D对象分类、组成和操作

             分类:在U3d hierarchy 面板中出现的对象属于GameObject对象。通俗的说,就是当前场景(ps: 在游戏开发过程中,一个游戏可能有多个场景,通过切换场景达到切换关卡的效果)中出现的元素。组成场景的元素,也就是gameobject对象分为三类,一个是地形(2d开发中相当于背景),一个是角色模型(2d中相对于人物图片,术语为精灵),还一个是环境,如灯光、摄像机之类的。这与实际电影拍摄需要环境,演员,道具是一样的道理。

      

     组成: 一个GameObject对象由一个或多个组件构成,比如,一个对象需要受重力加速度的影响,需要添加 RigidBody 组件,如果该gameobject需要受玩家控制,就需要Script组件,通过代码控制游戏对象。通过GetComponent()方法获取绑定在GameObject对象上面的组件。

       

  GameObject的基本操作:

    1. GameObject.CreatePrimitive (PrimitiveType.xx);  //创建一个u3d固有对象,如方块,球,胶囊体等等

    2. GameObject.Instantiate (xx);   //实例化一个自定义的对象,预制对象

    3. GameObject.Find("xx")   //查找一个游戏中存在的对象

    4. GameObject.Destroy(xx);  //摧毁游戏中存在的对象,还有一个重载 GameObject.Destroy(xx,delaytime),即延迟多久摧毁游戏对象。

 

4.  基本游戏对象的操作。

    1. 直接操作

      gameObject.transform.translate(Vector3.forward * Time.delaytime * speed);  // 控制角色的前后左右移动

      gameobject.transform.rotate(Vector3.up * Time.delayTime * speed);   //控制角色的旋转,通过左手定则(大拇指指向(如: Vector.up 就是向上)标记的方向, 四个手指弯曲的方向就是旋转的方向)

      gameobject.transform.localScale = new Vector3(x,y,z)  表示xyz三个方向是缩放

 

           2.通过绑定Character Controller组件进行控制

       CharacterController controller = gameobject.getComponent();  //获取对象自身绑定的 角色控制器对象

       //通过射线技术在鼠标点击的位置

       Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
         RaycastHit hit;
         if (Physics.Raycast (ray, out hit))

          {
         //获取物体移动的向量 = 鼠标点击空间坐标 - 物体当前空间坐标

         Vector direcPoint = Vector3.ClampMagnitude (hit.point  - gameObject.transform.position, 0.3f);

         controller.move(direcPoint );
        }

 

    3. 通过绑定Nav Mesh Agent组件进行空间寻址

      通过此方式可以通过点击屏幕位置,角色对象会自动规划一条路线并进行移动,而制作重点在于bake(烘焙地图)。

      1》   在菜单栏Window->Navigation中调出烘焙设置窗口,如下:

      U3d开发个人总结_第1张图片

     2.》 在Hierarchy窗口中选择相关的gameobject对象分别进行烘焙处理,比如说:(胶囊体为控制角色,长方体为静止物体,胶囊体不能从中穿过或从上跳过)

      U3d开发个人总结_第2张图片 

      则需要对平面和长方体进行烘焙处理,保证能为胶囊体的运动自动开辟出一条路线,烘焙的关键在于Navigation Area参数的选择

      Plane的烘焙设置:

      U3d开发个人总结_第3张图片

    

         Cube(长方体)

                U3d开发个人总结_第4张图片

 

    3》 在Capsule(胶囊体)上添加组件Script组件,选择相应的脚本文件进行控制。      

      Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
      RaycastHit hit;
      if (Physics.Raycast (ray, out hit))

       {
        GameObject hitObj = hit.collider.gameObject;
        if (hitObj.name == "Plane")

         {
          Vector3 endpoint = hit.point;
          agent.SetDestination (endpoint);
        }

      }

 

    ps:  Vector3 是一个三维对象类,既可以表示一个三维坐标点,又可以表示一个空间向量。

           参考资料:http://blog.csdn.net/blues1021/article/details/49009951

      

 

      

    

 

   

  

 

    

转载于:https://www.cnblogs.com/android-er/p/6015473.html

你可能感兴趣的:(U3d开发个人总结)