Unity 黑暗之光 笔记 第三章
第三章 角色控制
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黑暗之光的其他笔记
Unity 黑暗之光 笔记 第三章的更多相关文章
- Android群英传笔记——第三章:Android控件架构与自定义控件讲解
Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...
- 《DOM Scripting》学习笔记-——第三章 DOM
<Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...
- 《Linux内核设计与分析》第六周读书笔记——第三章
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...
- spring boot 笔记--第三章
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
- The Road to learn React书籍学习笔记(第三章)
The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...
- [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设
[HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设 敲黑板!! <q>元素添加短引用,<blockquote>添加长引用 在段落里添加引用就使用< ...
- JVM学习笔记-第三章-垃圾收集器与内存分配策略
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...
- Unity 黑暗之光 笔记 第一章
第一章 设计游戏开始进入场景 1.设置相机视野同步 选中要调整的相机 GameObject - Align With View(快捷键 Ctrl + Shift + F)
- 《SQL CookBook 》笔记-第三章-多表查询
目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...
随机推荐
- 如何获取流式应用程序中checkpoint的最新offset
对于流式应用程序,保证应用7*24小时的稳定运行,是非常必要的.因此对于计算引擎,要求必须能够适应与应用程序逻辑本身无关的问题(比如driver应用失败重启.网络问题.服务器问题.JVM崩溃等),具有 ...
- ctf-web-sql
姿势文章总结 freebuf http://www.freebuf.com/news/139288.html http://www.freebuf.com/articles/web/137094.ht ...
- 【惊喜】Github爆火的java面试神技+java核心面试技术已开发下载,大厂内都传疯了!
前言 今年,由于疫情的影响,很多互联网企业都在缩减招聘成本.作为程序员,原本这两年就面临竞争激烈.年龄危机的问题,而现在的求职局面又完全是企业在挑人的状态. 所以最好能在空闲的时候看看大厂相匹配的技术 ...
- FL Studio钢琴卷轴之刷子工具以及其他
上一篇文章我们重点讲解了FL Studio钢琴卷轴的画笔工具,今天我们就来讲解钢琴卷轴窗口中剩下的工具.由于接下来的工具都很简单,所以我们将放在一起讲,现在就和小编一起来看看FL Studio钢琴卷轴 ...
- MathType中如何编辑求和公式
在学习过程中,尤其是在写需要用到数学公式的论文的时,需要输入数学公式并进行格式编辑等,那么对于简单的公式可以使用Office自带的公式编辑器,对于复杂的公式建议使用专业的公式编辑器MathType,该 ...
- 视频剪辑软件Camtasia的快捷键大全
今天来给大家介绍一下Camtasia快捷键的相关内容,Camtasia也是一个十分好用的电脑屏幕录制与视频剪辑制作软件了,可能有些朋友用过,毕竟它在视频录制与制作上确实比较好用. 首先在菜单栏中点击& ...
- 【电子取证:镜像仿真篇】Windows Server镜像仿真、vmdk镜像仿真
Windows Server镜像仿真.vmdk镜像仿真 时间过得真快呀!--[suy999] Windows Server镜像仿真.vmdk镜像仿真 一.qemu-img镜像转换工具 (一)raw.q ...
- 蓝桥杯——分组比赛(2017JavaB组第3题)
分组比赛(17JavaB3) 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法: ABC DEF GHI ABC D ...
- Java基础教程——注解
注解 JDK 5开始,Java支持注解. 注解,Annotation,是一种代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取并执行,而且不改变原有的逻辑. 注解可以用于:生成文档.编译检查. ...
- redis-cli 持久化,复制,哨兵,事务,流水线
一.持久化: 快照文件RDB 保存"开始"创建新快照一刻的内存快照,创建过程的内存变化不会被记录 创建快照的办法有几种 1.客户端可以通过想Redis发送BGSAVE来创建一个快照 ...