先上一个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 }
下一篇想弄动画的剪切,因为美工给程序的动画是一个总体。我们需要把某一个动作。比如蹦跑,杀怪等单个动画弄出来播放,就像上面的
transform.animation.Play("attack");//攻击