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 ...
随机推荐
- python3 多线程批量验证POC模板
#coding:utf-8 import threading,Queue,sys,os class RedisUN(threading.Thread): def __init__(self,queue ...
- 万字长文!从底层开始带你了解并发编程,彻底帮你搞懂java锁!
线程是否要锁住同步资源 锁住 悲观锁 不锁住 乐观锁 锁住同步资源失败 线程是否要阻塞 阻塞 不阻塞自旋锁,适应性自旋锁 多个线程竞争同步资源的流程细节有没有区别 不锁住资源,多个线程只有一个能修改资 ...
- 应聘阿里,字节跳动美团90%会问到的JVM面试题! 史上最全系列!
Java 内存分配 • 寄存器:程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码.• 静态域:static 定义的静态成员.• 常量池:编译时被确定并保存在 .class 文件中的(f ...
- zabbix的搭建及操作(2)监控windows10及网络设备
实验环境 配置完成的Server端 Web --详情点击 windows10 192.168.10.1 (与虚拟机同一Vmnet的IP地址)必须关闭防火墙 网络设备GNS 192.168.10.50 ...
- 使用Sidechain EQ优化FLStudio的贝斯和底鼓
混音的目标之一是平衡各个声音的音量.当两个声音占据相同的频率范围时,有时就比较难处理.这是贝司和底鼓之间经常会碰到的情况.很多时候我们会使用压缩(compression)来降低他们的音量. 然而,有 ...
- Markdown特点
前言 以前经常在 gitHub 中看到 .md 格式的文件,一直没有注意,也不明白为什么文本文档的后缀不是 .txt ,后来无意中看到了 Markdown,看到了用这个东西写得一些web界面等特别的规 ...
- 用大白话讲大数据HBase,老刘真的很用心(1)
老刘今天复习HBase知识发现很多资料都没有把概念说清楚,有很多专业名词一笔带过没有解释.比如这个框架高性能.高可用,那什么是高性能高可用?怎么实现的高性能高可用?没说! 如果面试官听了你说的,会有什 ...
- 【ACwing 100】InDec序列——差分
(题面来自AcWing) 给定一个长度为 n 的数列 a1,a2,-,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中的所有数都一样, ...
- Java集合【8】-- ArrayList源码分析
目录 1. ArrayList 1.1 ArrayList特点介绍 1.2 实现的接口和继承的类 2. 成员变量 3. 构造方法 4. 常用增删改查方法 添加元素 查询元素 更新元素 删除元素 5.自 ...
- [原理] Android Native内存泄漏检测原理解析
转载请注明出处:https://www.cnblogs.com/zzcperf/articles/11615655.html 上一篇文章列举了不同版本Android OS内存泄漏的检测操作(传送门), ...