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 ...
随机推荐
- Environment Cubemap
要创建一个Cubemap(将您的环境捕获到一个Cubemap中),您需要去Unity Documentation复制RenderCubemapWizard.cs脚本! 然后在"Project ...
- [原题复现]2019上海大学生WEB-Decade(无参数RCE、Fuzz)
简介 原题复现: 考察知识点:无参数命令执行.Fuzz 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 环境复现 ...
- vue在移动端使用alloyfinger手势库操作图片拖拽、缩放
最近开发一个活动需要在手机上给上传的头像加上边框.装饰,需要拖拽.手势缩放边框下的头像图片,因为是vue项目,开始尝试了vue-drag-resize这个组件,对图片拖拽支持很完美,但是无法手势缩放, ...
- 面试官:别的我不管,这个JVM虚拟机内存模型你必须知道
前言 说jvm的内存模型前先了解一下物理计算机的内存处理. 物理计算器上用户磁盘和cpu的交互,由于cpu读写速度速度远远大于磁盘的读写速度速度,所以有了内存(高速缓存区).但是随着cpu的发展,内存 ...
- Python Api接口自动化测试框架 代码写用例
公司新来两个妹子一直吐槽这个接口测试用例用excel维护起来十分费脑费事,而且比较low(内心十分赞同但是不能推翻自己),妹子说excel本来就很麻烦的工具,于是偷偷的进行了二次改版. 变更内容如下: ...
- 2016年第七届蓝桥杯【C++省赛B组】F、G、H、J 题解
F. 方格填数 #深搜 题意 有\(10\)个格子,填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻),求可能的填数方案数. +--+--+--+ | | | | +--+- ...
- 使用github actions 完成一些自动化工作
github actions 是什么? github actions是github的持续集成及自动化工作流服务,使用起来都比较方便.大部分github actions都可以在https://githu ...
- 一周一个中间件-hbase
前言 hbase是大数据的生态的一部分,是高可靠性.高性能.列存储.可伸缩.实时读写的数据库系统.介于nosql和RDBMS之间.主要存储非结构化和半结构化的松散数据. 海量数据存储 快速随机访问 大 ...
- web自动化-绕过登录
两个方法: 1.常用的方法: 第一种方法是登录后查看网站的 cookie,请求 url 的时候把 cookie 带上(缺点是:cookie有时间限制.优点:简单,方便) 2.添加cookies的方式: ...
- SpringCloud 源码系列(1)—— 注册中心 Eureka(上)
Eureka 是 Netflix 公司开源的一个服务注册与发现的组件,和其他 Netflix 公司的服务组件(例如负载均衡.熔断器.网关等)一起,被 Spring Cloud 整合为 Spring C ...