【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 }

 

运行结果:

 

 

posted @ 2016-10-16 19:28  silent-bobo  阅读(289)  评论(0编辑  收藏  举报