您的位置:首页 > 移动开发 > Unity3D

unity3d-代码控制游戏角色控制器移动

2016-11-04 09:33 766 查看
先上一个gif看看效果。因为图片大小限制。所以录制的比较小。个人认为效果比较牵强。特别是里面的逻辑代码。 



 

工程结构图



 这次实现的效果是:

 1:摄像机跟着角色移动,上篇博客说的是。把摄像机变成角色的子对象。发现没有我想要的效果。跟着角色移动代码是我自己弄出来的。不知道实际项目中是否也是这样。

 2:利用角色控制器组建 CharacterController 实现角色移动。

 3:当鼠左键击地形,角色自动寻路。今天发现用unity3d有自带的NavMesh实现自带寻路,不过还没去研究。

 4:当鼠左键点击地形。实现一个高亮效果。

 5:鼠标右键单击播放杀怪动画。

 6:到达关卡场景,进入下一关。本来是想杀boss后在进入,但血条不会弄。

 ..............

Hierarchy视图中元素。分别是:主摄像机,平行光,地形,墙(也就是我这里的关卡),无效的元素,当前角色,鼠标点击显示图片,boss

 

 

加载场景的时候。需要把加载的场景Build进去

 


 

最后看看实现代码 ,有点牵强。也写了很多注释。方便大家和自己以后查看。

 



1 using UnityEngine;
2 using System.Collections;
3
4 public class chartMove : MonoBehaviour
5 {
6
7     public float speed = 5f;
8     public GameObject cursor;//鼠标点击光标显示图片
9     public GameObject boos; //boos对象
10
11
12     private Vector3 targetPos; //目标位置
13     private Vector3 mousePos; //鼠标单击的位置
14     private Vector3 beforePos;//角色移动前的位置
15     private CharacterController charController = null;
16     private bool cursorState = false; //当前是否点击了鼠标
17     private bool BossIsDie;//bos是否over
18
19     // Use this for initialization
20     void Start()
21     {
22         charController = GetComponent<CharacterController>();
23         targetPos = transform.position;
24         mousePos = transform.position;
25     }
26
27     // Update is called once per frame
28     void Update()
29     {
30         beforePos = transform.position; //保存当前的位置
31
32         //获取按键轴
33         /*
34          * Horizontal-->对应键盘上上的A,D
35          * Vertical-->对应键盘上上的W,S
36          * 当没有按键的时候为0 。
37          * 其值分别为 -1(左,下) 0 1(上。右)
38          */
39         float x = Input.GetAxis("Horizontal");
40         float y = Input.GetAxis("Vertical");
41
42         //transform.Translate(new Vector3(x, 0, y) * Time.deltaTime * speed,Space.World);
43
44         //if (x == 0 && y == 0 && !cursorState)
45         //{
46         //    transform.animation.Play("idle");
47         //}
48         if (x != 0 || y != 0)
49         {
50             transform.animation.Play("run"); //奔跑
51             cursor.SetActive(false);
52             //charController.Move(new Vector3(x, 0, y) * Time.deltaTime * speed);
53             //transform.Translate(new Vector3(x, 0, y) * Time.deltaTime * speed, Space.World);
54             cursorState = false;
55             charController.SimpleMove(new Vector3(x, 0, y) * speed);
56
57             //设置角色面朝的方向
58             Vector3 lookPos = transform.position - beforePos + transform.position;
59             transform.LookAt(lookPos);
60         }
61         else
62         {
63
64         }
65
66
67         //左键选择路径
68         if (Input.GetMouseButtonDown(0))
69         {
70             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
71             RaycastHit hit;
72             if (Physics.Raycast(ray, out hit, 100)) //100为射线的长度,限制用户瞎点击。在100以为点击无效
73             {
74                 if (hit.collider.name == "Terrain")
75                 {
76                     mousePos = hit.point;
77                     Vector3 lookPos = mousePos - transform.position + transform.position;
78                     transform.LookAt(lookPos);
79                     cursor.SetActive(true); //显示图片:图片一开始是隐藏的。
80                     cursor.transform.position = mousePos;
81                     cursorState = true;
82                 }
83             }
84         }
85
86
87         //判断角色是否到达目的地
88         int distance = (int)Vector3.Distance(mousePos, transform.position);
89
90         //这个1.08的临界值。我是根据调试得来的。具体为什么是1.08,暂时还不知道
91         if (distance > 1.08f && cursorState)
92         {
93             transform.animation.Play("run"); //奔跑
94
95             //控制向量长度在 speed 范围在内
96             Vector3 setp = Vector3.ClampMagnitude(mousePos - transform.position, speed);
97             //charController.Move(setp*0.3f); //开始我用这个方法。不是我想要的效果
98             /*
99               这里要区别于:Move() 一个更加复杂的运动函数,每次都绝对运动
100              * SimpleMove:以一定的速度移动角色
101              */
102             //cursorState = false;
103             charController.SimpleMove(setp);
104
105         }
106         else
107         {
108             if (x == 0 && y == 0)
109             {
110                 //transform.animation.Play("idle");
111                 cursor.SetActive(false);
112                 //cursorState = false;
113                 if (!transform.animation.IsPlaying("attack"))//当前没有攻击
114                     transform.animation.Play("idle");
115             }
116             //transform.animation.Play("idle");
117         }
118         //右键攻击
119         /*
120          GetMouseButton:按下不弹起就一直执行
121          * GetMouseButtonDown:按下执行一次。
122          *
123          */
124         if (Input.GetMouseButton(1))
125         {
126             cursorState = true;
127             transform.animation.Play("attack");//攻击
128         }
129         //transform.animation.Play("run"); //奔跑
130         //设置角色面朝的方向
131         //Vector3 lookPos = transform.position - beforePos + transform.position;
132         //transform.LookAt(lookPos);
133
134
135         //设置相机跟随
136         Vector3 camera = Camera.main.transform.position; //获取主相机的位置
137         Vector3 currChart = transform.position;//当前角色位置
138
139         camera.x = currChart.x;
140         camera.y = currChart.y + 5;
141         camera.z = currChart.z - 10;
142
143         Camera.main.transform.position = camera;
144
145         //if ((charController.collisionFlags & CollisionFlags.Above) != 0)
146         //    print("touched the ceiling");
147
148     }
149     /// <summary>
150     /// 当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用。
151     /// </summary>
152     /// <param name="hit"></param>
153     public void OnControllerColliderHit(ControllerColliderHit hit)
154     {
155
156         //如果碰到的是墙并且boos is die,进入下一关,这里 墙 代替关卡
157         if (hit.transform.name == "wall")
158         {
159             //加载关卡,2 表示Build Settings中场景的索引
160             Application.LoadLevel(2);
161         }
162     }
163
164     public void OnTriggerEnter(Collider other)
165     {
166
167     }
168
169 }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: