第三章 角色控制

 

1.创建游戏运行场景并导入素材资源

2.创建和管理标签

1        //const 表明这个是一个共有的不可变的变量
2 public const string ground = "Ground";//地面标签
3 public const string player = "Player";//人物标签

3.实现角色行走点击效果

给角色添加PlayerDir点击效果代码

 1        public GameObject effect_click_prefab;
2 void Update ()
3 {
4 if (Input.GetMouseButtonDown(0))
5 {
6 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
7 RaycastHit hitInfo;
8 //使用射线进行检测
9 bool isCollder = Physics.Raycast(ray, out hitInfo);
10 if (isCollder && hitInfo.collider.tag == Tags.ground)
11 {
12 //实例化点击的效果
13 ShowClickEffect(hitInfo.point);
14 }
15 }
16 }
17 void ShowClickEffect(Vector3 hitPoint)
18 {
19 hitPoint = new Vector3(hitPoint.x, hitPoint.y + 0.188888888f, hitPoint.z);
20 GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity);
21 }

4.控制角色移动朝向

添加控制主角移动并优化PlayerDir代码

       public GameObject effect_click_prefab;
private bool isMoving = false;//表示鼠标是否按下
bublic Vector3 targetPosition = Vector3.zero;
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
RaycastHit hitInfo;
//使用射线进行检测
bool isCollder = Physics.Raycast(ray, out hitInfo);
if (isCollder && hitInfo.collider.tag == Tags.ground)
{
isMoving = true;
//实例化点击的效果
ShowClickEffect(hitInfo.point);
LookAtTarger(hitInfo.point);
}
}
if (Input.GetMouseButtonUp(0))
{
isMoving = false;
}
//点击按下之后一直朝向鼠标位置
if (isMoving)
{
//得到要移动的目标位置
//让主角朝向目标位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
RaycastHit hitInfo;
//使用射线进行检测
bool isCollder = Physics.Raycast(ray, out hitInfo);
if (isCollder && hitInfo.collider.tag == Tags.ground)
{
LookAtTarger(hitInfo.point);
}
}
}
/// <summary>
/// 实例化点击效果
/// </summary>
/// <param name="hitPoint"></param>
void ShowClickEffect(Vector3 hitPoint)
{
hitPoint = new Vector3(hitPoint.x, hitPoint.y + 0.188888888f, hitPoint.z);
GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity);
}
/// <summary>
/// 主角朝向位置
/// </summary>
/// <param name="hitPoint"></param>
void LookAtTarger(Vector3 hitPoint)
{
targetPosition = hitPoint;
targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z);
this.transform.LookAt(targetPosition);
}

5.控制角色的移动

给角色添加Character Controller碰撞体组件

添加PlayerMove代码控制移动

 1     public float speed = 1f;//移动速度
2 private PlayerDir dir;
3 private CharacterController controller;
4 void Start()
5 {
6 dir = this.GetComponent<PlayerDir>();
7 controller = this.GetComponent<CharacterController>();
8 }
9 void Update()
10 {
11 float distance = Vector3.Distance(dir.targetPosition,transform.position);
12 if (distance > 0.5f)
13 {
14 controller.SimpleMove(transform.forward * speed);
15 }
16 }

6.控制角色移动动画播放

添加角色的移动动画

 

为PlayerMove代码添加枚举并更改Update

 1 public enum PlayerState
2 {
3 Moving,
4 Idle
5 }
6 public PlayerState state = PlayerState.Idle;
7
8 void Update()
9 {
10 float distance = Vector3.Distance(dir.targetPosition,transform.position);
11 if (distance > 0.5f)
12 {
13 state = PlayerState.Moving;
14 controller.SimpleMove(transform.forward * speed);
15 }
16 else
17 {
18 state = PlayerState.Idle;
19 }

新建PlayerAnimation动画切换代码

 1        private PlayerMove move;
2 void Start ()
3 {
4 move = this.GetComponent<PlayerMove>();
5 }
6
7 void LateUpdate ()
8 {
9 if (move.state == PlayerState.Moving)
10 {
11 PlayAnim("Walk");
12 }
13 else if (move.state == PlayerState.Idle)
14 {
15 PlayAnim("Idle");
16 }
17 }
18 void PlayAnim(string animName)
19 {
20 //animation.CrossFade(animName);
21 GetComponent<Animation>().CrossFade(animName);
22 }

7.添加控制相机跟随主角移动

给主相机添加FollowPlayer脚本并给人物添加Player标签

 1        private Transform player;
2 private Vector3 offsetPosltion;//位置偏移
3 void Start ()
4 {
5 player = GameObject.FindGameObjectWithTag(Tags.player).transform;
6 transform.LookAt(player.position);
7 offsetPosltion = transform.position - player.position;
8 }
9
10 void Update ()
11 {
12 transform.position = offsetPosltion + player.position;
13 }

8.控制视野的拉近和拉远

FollowPlayer代码中定义变量distance和scrollSpeed

 1        public float distance = 0f;//人物与相机的距离
2 public float scrollSpeed = 5f;//相机移动速度
3 添加scrollView方法并在Update中引用
4 /// <summary>
5 /// 视野的拉近和拉远效果
6 /// </summary>
7 void ScrollView()
8 {
9 print(Input.GetAxis("Mouse ScrollWheel"));//向前滑动返回正值 向后滑动返回负值
10 distance = offsetPosltion.magnitude;//位置偏移的magnitude值
11 distance += Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
12 distance = Mathf.Clamp(distance, 2, 18);//距离限制
13 offsetPosltion = offsetPosltion.normalized * distance;
14 }

9.控制视野的旋转

FollowPlayer代码中定义变量isRotating和rotateSpeed

1        private bool isRotating = false;
2 public float rotateSpeed = 1f;//相机旋转速度

添加RotateView方法并在Update中引用

 1        /// <summary>
2 /// 视野的旋转
3 /// </summary>
4 void RotateView()
5 {
6 //Input.GetAxis("Mouse X");//得到鼠标在水平方向的滑动
7 //Input.GetAxis("Mouse Y");//得到鼠标在垂直方向的滑动
8 if (Input.GetMouseButtonDown(1))
9 {
10 isRotating = true;
11 }
12 if (Input.GetMouseButtonUp(1))
13 {
14 isRotating = false;
15 }
16 if (isRotating)
17 {
18 transform.RotateAround(player.position, player.up, rotateSpeed * Input.GetAxis("Mouse X"));
19 Vector3 originalPos = transform.position;
20 Quaternion originalRotation = transform.rotation;
21 transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));//影响属性有两个 position rotation
22 float x = transform.eulerAngles.x;
23 if (x < 10 || x > 80)
24 {//当超出范围之后,将属性归位原来的,让旋转无效
25 transform.position = originalPos;
26 transform.rotation = originalRotation;
27 }
28 }
29 offsetPosltion = transform.position - player.position;
30 }

10.角色添加状态信息

给角色添加PlayerStatus代码

 1     public int grade = 1;//等级
2 public int hp = 100;//血量
3 public int mp = 100;//蓝量
4 public int coin = 200;//金币数量
5 public int attack = 20;
6 public int attack_plus = 0;
7 public int def = 20;
8 public int def_plus = 0;
9 public int speed = 20;
10 public int speed_plus = 0;
11 public int point_remain = 0;//剩余的点数

11.修复BUG

修改PlayerDir

 1        public GameObject effect_click_prefab;
2 public Vector3 targetPosition = Vector3.zero;
3 private bool isMoving = false;//表示鼠标是否按下
4 private PlayerMove playerMove;
5 void Start()
6 {
7 targetPosition = transform.position;
8 playerMove = this.GetComponent<PlayerMove>();
9 }
10 void Update ()
11 {
12 if (Input.GetMouseButtonDown(0))
13 {
14 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
15 RaycastHit hitInfo;
16 //使用射线进行检测
17 bool isCollder = Physics.Raycast(ray, out hitInfo);
18 if (isCollder && hitInfo.collider.tag == Tags.ground)
19 {
20 isMoving = true;
21 //实例化点击的效果
22 ShowClickEffect(hitInfo.point);
23 LookAtTarger(hitInfo.point);
24 }
25 }
26 if (Input.GetMouseButtonUp(0))
27 {
28 isMoving = false;
29 }
30 //点击按下之后一直朝向鼠标位置
31 if (isMoving)
32 {
33 //得到要移动的目标位置
34 //让主角朝向目标位置
35 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
36 RaycastHit hitInfo;
37 //使用射线进行检测
38 bool isCollder = Physics.Raycast(ray, out hitInfo);
39 if (isCollder && hitInfo.collider.tag == Tags.ground)
40 {
41 LookAtTarger(hitInfo.point);
42 }
43 }
44 else
45 {
46 if (playerMove.isMoving)
47 {
48 LookAtTarger(targetPosition);
49 }
50 }
51 }
52 /// <summary>
53 /// 实例化点击效果
54 /// </summary>
55 /// <param name="hitPoint"></param>
56 void ShowClickEffect(Vector3 hitPoint)
57 {
58 hitPoint = new Vector3(hitPoint.x, hitPoint.y + 0.188888888f, hitPoint.z);
59 GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity);
60 }
61 /// <summary>
62 /// 主角朝向位置
63 /// </summary>
64 /// <param name="hitPoint"></param>
65 void LookAtTarger(Vector3 hitPoint)
66 {
67 targetPosition = hitPoint;
68 targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z);
69 this.transform.LookAt(targetPosition);
70 }

修改PlayerMove方法

 1     public float speed = 1f;//移动速度
2 public PlayerState state = PlayerState.Idle;
3 public bool isMoving = false;
4 private PlayerDir dir;
5 private CharacterController controller;
6 void Start()
7 {
8 dir = this.GetComponent<PlayerDir>();
9 controller = this.GetComponent<CharacterController>();
10 }
11 void Update()
12 {
13 float distance = Vector3.Distance(dir.targetPosition,transform.position);
14 if (distance > 0.5f)
15 {
16 isMoving = true;
17 state = PlayerState.Moving;
18 controller.SimpleMove(transform.forward * speed);
19 }
20 else
21 {
22 isMoving = false;
23 state = PlayerState.Idle;
24 }
25 }

Unity 黑暗之光 笔记 第三章的更多相关文章

  1. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  2. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

  3. 《Linux内核设计与分析》第六周读书笔记——第三章

    <Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...

  4. spring boot 笔记--第三章

    spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...

  5. The Road to learn React书籍学习笔记(第三章)

    The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...

  6. [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设

    [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设 敲黑板!! <q>元素添加短引用,<blockquote>添加长引用 在段落里添加引用就使用< ...

  7. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  8. Unity 黑暗之光 笔记 第一章

    第一章 设计游戏开始进入场景 1.设置相机视野同步 选中要调整的相机 GameObject - Align With View(快捷键 Ctrl + Shift + F)

  9. 《SQL CookBook 》笔记-第三章-多表查询

    目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...

随机推荐

  1. 重闯Sqli-labs关卡第二天(5关)

    第五关(双注入GET单引号字符型注入-报错时间注入) 盲注盲注,Blind SQL Injection基于布尔SQL盲注基于时间的SQL盲注基于报错的SQL盲注 核心代码:(不会返回数据库中的数据) ...

  2. FL studio系列教程(九):FL Studio中如何排列编曲

    在FL Studio水果音乐制作软件播放列表中可以对制作的样本进行编排,除此之外,播放列表中排列的对象被叫做剪辑.在其中可以排列以下剪辑. 1.样本剪辑:样本剪辑包含了编排好的插件乐器音符数据. 2. ...

  3. FL Studio中有关Sub Bass的一些制作与混音技巧

    1.Sub Bass是什么? Sub Bass是一种低沉的低音,其频率大约低于60赫兹,并向下延伸,包括人类所能听到的最低频率,约为20赫兹.在这个范围内,人类的听觉不是很灵敏,所以在这个范围内的声音 ...

  4. web自动化测试--iframe切换

    什么是iframe切换,我们在测试web网页过程中,可能会遇到一个网页中嵌套另一个网页的情况,如下图,就是一个ifame嵌套的例子 我们如何切换呢,别急,webdriver里有方法,可以切换到ifra ...

  5. 再也不用担心问RecycleView了——面试真题详解

    关于RecycleView,之前我写过一篇比较基础的文章,主要说的是缓存和优化等问题.但是有读者反映问题不够实际和深入.于是,我又去淘了一些关于RecycleView的面试真题,大家一起看看吧,这次的 ...

  6. Oracle数据库由dataguard备库引起的log file sync等待

    导读: 最近数据库经常出现会话阻塞的报警,过一会又会自动消失,昨天晚上恰好发生了一次,于是赶紧进行了查看,不看不知道,一看吓一跳,发现是由dataguard引起的log file sync等待.我们知 ...

  7. Jmeter如何监测被测服务器资源

    前言 Jmeter自身不支持对服务器的监控,需要安装第三方插件进行扩展. 下载插件 jmeter添加插件步骤,选项-PluginManager 勾选上PerfMon选项,点击右下角的Apply-按钮 ...

  8. 第四章:动态规划I

    4.1背包问题 动态规划的核心:如何构造一个高效的备忘录,提高整个问题求解的效率. 4.2最大子数组问题II

  9. MySql学习笔记--详细整理--下

    目录 索引 测试索引 索引原则 权限管理和备份 备份 规范数据库设计 三大范式 JDBC JDBC程序 Statement对象 工具类实现 sql注入 PreparedStatement对象 事务 数 ...

  10. Pytest系列(十三)- 重复执行之pytest-repeat的使用

    写在前面 这个插件,可以帮助我们很好的解决自动化测试过程中的一些偶线性bug难以复现的问题,但前提是,当前自动化脚本是独立的,不依赖任何其他脚本.个人觉得还是失败重运行的一种体现,就和TestNG是一 ...