【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- 实际应用physic:控制你的角色在真实的环境中行走
首先构造场景(由于没有美术资源,所以比较简陋)
使用unity自带的3d的GameObject创建的
如图
在人物身上添加Character Controller 物理引擎
将其他的对象都设置成 static 并且都添加上box Controller 组件
然后添加脚本
首先是添加摇杆的脚本 (stick.cs)
添加到人物身上的Camera
主要思路:
当鼠标抬起的时候将camDelta 设置成初始位置0,
当鼠标按下的时候,
如果发现 camDelta 是初始位置,、
则获取鼠标移动后与初始位置的位移,
就是鼠标在屏幕中的位移
stick.cs
1 using UnityEngine; 2 using System.Collections; 3 4 public class stick : MonoBehaviour { 5 6 public static Vector3 camDelta = Vector3.left; // 设置鼠标的位移 7 private Vector3 startPos; // 鼠标按下的位置 8 9 // Use this for initialization 10 void Start () { 11 12 } 13 14 // Update is called once per frame 15 void Update () { 16 17 // 鼠标按下 18 if (Input.GetMouseButton(0)) 19 { 20 if (Vector3.left == startPos) 21 { 22 startPos = Input.mousePosition; // 鼠标按下的位置 23 } 24 else 25 { 26 camDelta = Input.mousePosition - startPos; // 鼠标移动的位移 27 } 28 } 29 else if (Input.GetMouseButtonUp(0))// 鼠标左键抬起,恢复默认值 30 { 31 camDelta = Vector3.zero; 32 startPos = Vector3.left; 33 } 34 Debug.Log("鼠标移动的位移 " + camDelta); 35 } 36 }
actor.cs
1 using UnityEngine; 2 using System.Collections; 3 4 public class actor : MonoBehaviour { 5 6 public float speed = 1; // 人物默认行走的速度 7 8 public CharacterController cc; // 获取 CharacterController 组件 9 10 // Use this for initialization 11 void Start () { 12 cc = GetComponent<CharacterController>(); 13 } 14 15 // Update is called once per frame 16 void Update () { 17 18 if(stick.camDelta == Vector3.left) 19 { 20 return; 21 } 22 23 // 这个摄像机必须是Main Camera才有效 24 // 摄像机的y轴向量在世界坐标系下的表示 25 Vector3 worldYDirection = Camera.main.transform.TransformDirection(Vector3.up); 26 // 在将y轴向量去掉,然后在规划,得到的就是在y轴上的投影,在乘以速度,就是当前移动的距离 27 Vector3 groundYDirection = new Vector3(worldYDirection.x, 0, worldYDirection.z).normalized * stick.camDelta.y; 28 Vector3 worldXDirection = Camera.main.transform.TransformDirection(Vector3.right); 29 Vector3 groundXDirection = new Vector3(0, worldXDirection.y, worldXDirection.z).normalized * stick.camDelta.x; 30 Vector3 directionXY = (groundXDirection + groundYDirection).normalized; 31 Vector3 motion = directionXY * speed; 32 motion.y = -1000; // 为了让人物紧贴地面,将其深度设置在地面以下,由于碰撞的原因,人物就会紧贴地面 33 cc.Move(motion); 34 35 Debug.Log("-- silent -- motion = " + motion); 36 37 } 38 }
运行结果: