【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 }
运行结果: