0724
视频:8 脚本基础2
- 学习代码的方法
- 类似小时候学习写文章的思路 类比
-
单独的字就是 代码中的关键字
单独的字.png -
如何学习写句子呢 目的是实现一定的目的和功能
写语句.png -
多个句子组成的特定的段落 同写句子 就是在句子的基础上组织语言
段落.png -
文章 主题 单个代码文件
写文章.png -
写书 或者专栏 系统
工程.png
- 要点复习串讲
08串讲.png- 变量
-
声明 赋值
变量.png -
基本类型
变量的基本类型.png
1.自定义类型
自定义类型.png
- 表达式
表达式.png-
比如数学的表达式
-
不能作为单独的语句存在 前面需要一个变量接收
-
强制转换的方式
float a = (float)3.14 + 10;
-
其中(float)就是强制转换
float b = 10;
-
这个不会报错 低转高可以转换
- 方法
方法.png- 去完成一件事 方法类型 方法名 参数 花括号 返回值
- 方法中返回的结果要与方法返回值的类型一致
- 方法的使用需要传参数 并可以定义一个变量来接收这个结果 也可以之间调用方法不接收返回值
- 语句
语句.png- 判断语句
判断语句if.png-
if()里面可以是表达式也可以是bool类型的变量
判断语句 逻辑表达式.png
- 注释
注释.png- Unity相关API
-
脚本本身与挂在物体上的关系是 由一个虚的东西变成一个实例 或者说由一个抽象的东西变成一个具体的
API.png
- 实战1 如何改变物体的颜色
1. 需求分析 逻辑
2. 解决途径
-
思路和步骤 语言的转换
解决途径.png - 搜索加上unity
-
在博客里找到关键点 去官方文档查使用方法 文档里有实例 最好看英文
搜索.png
OnMouseEnter举例
索引 第一次.png看文档中的代码示例
了解细节.png
层的应用
-
相机
culling mask 可以识别不同的层 让其显示 -
同理 light中的culling mask 也可以进行筛选 如果不筛选 就受不到光照
-
scene本身可以进行层的筛选
如何修改物体的颜色
脚本中进行实现
-
新建脚本 托给 新建的物体 利用之前查找到的方法 unity自身提供的方法 检测到鼠标移动到相应的物体上可以进行执行一些语句
private void OnMouseEnter() { } private void OnMouseExit() { }
-
获取组件的语句 尖括号中是获取的组件的名称 通过“.”可以进行获取相应组件里的东西 在进行赋值
GetComponent<MeshRenderer>().material.color = Color.yellow;
-
移开的时候怎么处理呢 先定义一个初始的颜色 变量 定义在哪个花括号内 就只能在某个大括号内调用
Color OldColor;
-
然后在一开始时给前面的变量赋值 相当于修改 把所挂代码的游戏对象的颜色赋给这个变量
OldColor = GetComponent<MeshRenderer>().material.color;
-
这样在鼠标离开物体的方法里就可以让颜色复原
private void OnMouseExit() { GetComponent<MeshRenderer>().material.color = OldColor; }
-
当然也可以重新变一个颜色 和前面的Color.yellow一样
-
优化点 多次用到了 GetComponent<MeshRenderer>() 可以定义一个MeshRenderer类型的变量 将这个组件缓存下来
MeshRenderer _renderer;
-
在start方法里就把多次用到的组件赋值给这个变量 前面所需要调取组件的地方都可以替换为_renderer 这个变量
_renderer = GetComponent<MeshRenderer>();
- 实战2 吃药回血
- 首先新建场景 PlayerCure 然后新建一个空物体 并给它添加脚本
写代码前需要 理清思路和逻辑
吃药回血.png需求分析
需求分析.png-
角色血量
角色血量.png
-
定义变量 可以在Inspector中设置 说明是一个公开类型的的变量 游戏中常叫生命值为Hp 对于一个int类型的变量 如果不赋值 默认为0 这里给它赋值为100
public int Hp=100;
-
因为在外面可以修改 如果变量有一个最大值 为了防止误操作 超过了最大的值 可以用一个判断进行避免
-
在start方法里 进行判断 如果超过最大值 再赋一次值 这样就限制了最大血量
if (Hp > 100) { Hp = 100; }
-
能量详解
能量详解.png
-
能量可以理解为可以持续回血的一个状态 可以是一种恢复的必要条件 就是为了回血而设置的
-
初始能量为0
-
满能量为100
-
同血量一样 进行定义 不需要赋值 因为默认为0
public int Energy;
-
为了实现每三秒掉一点能量 需要一个计时器 那么我们知道 update 是每帧调取一次 可以理解为每帧去渲染一次 每一次渲染的时间就可以用Time.deltaTime来表示
-
定义一个可以记录时间的变量 初始设为0
float _energyTimer=0;
-
如何记录呢 在update方法里 让它等于它加上每帧渲染的时间 相当于把每帧刷新的时间累加起来 也可以用+=来表示 要知道 计时的前提也是能量本身大于0 所以要在条件内进行执行
void Update () { if (Energy > 0) { _energyTimer= _energyTimer+Time.deltaTime; } }
-
根据需求需要对能量值随着时间进行减少 但得有个前提就是 能量大于0 才会减少 因为能量不会是负的 所以在条件内
if (Energy > 0) { _energyTimer= _energyTimer+Time.deltaTime; }
-
如何实现每隔三秒就执行减血的语句呢 可以用一个条件 判断前面的能量计时器的时间大于等于3 就执行 同时还需要将计时器重置成0 这样每刷新大于等于3秒就可以执行 减能量的语句
if (_energyTimer >= 3) { Energy -= 1; _energyTimer = 0; }
-
举例 当能量在1-20之间时 每8秒 血量增加1 后面的自己完善
-
同前面每三秒减少能量值一样 也需要一个计时器 用来计算能量提供回血的时间
float _energyHpTimer;
-
首先回血的前提是能量大于0 所以还是在之前的>0的条件内去写 和前面一样进行加等于
_energyHpTimer += Time.deltaTime;
-
进行回血的条件判断 并将计时器归0
if (_energyHpTimer >= 8) { //todo根据能量值回血 _energyHpTimer = 0; }
-
根据能量回血 也是判断 1-20 就是能量小于等于20时进行回血
if (Energy <= 20) { Hp += 1; }
-
else 进行除了上面的情况以外其他情况下进行执行的语句 它也可以加if 进行再次判断 并列把所有不符合第一个if的条件下的其他条件
if (Energy <= 20) { Hp += 1; } else if (Energy <= 60) { Hp += 2; } else if (Energy < 90) { Hp += 3; } else { Hp += 4; }
-
那么如果在加血量的过程中超过了100怎么办 为了保证最大血量为100 进行一个判断 并赋值为100
if (Hp > 100)Hp = 100;
-
做一个优化 当血量小于100时才会去回血 在最前面补一下
if (Hp < 100) { _energyHpTimer += Time.deltaTime; //每8秒回血 if (_energyHpTimer >= 8) { //todo根据能量值回血 if (Energy <= 20) { Hp += 1; } else if (Energy <= 60) { Hp += 2; } else if (Energy < 90) { Hp += 3; } else { Hp += 4; } if (Hp > 100) Hp = 100; _energyHpTimer = 0; } }
-
此时update方法里内容有些多不利于后面代码的书写 可以自定义一个能量跟新的方法 这样在update中就只用一句话就可以代替了 有种封装的意思
void Update () {
EnergyUpdate(); }
-
调用方法时需要加上小括号 方法是一系列语句的一个集合
-
按键1-6
按键1-6.png
-
同理 为了整洁 也可重新定义一个方法进行直接调用
KeyUpdate();
-
然后在方法里进行实现其不同功能 需要用if条件
-
如何在条件中获取键盘的数字 固定的方法 按下键的整个过程
private void KeyUpdate() { if (Input.GetKeyDown(KeyCode.Alpha1)) { } }
-
然后对应按下字母上方的数字1后 有一个绷带的效果 可以再定义一个绷带的方法 在这个条件里只需要调用就好啦
private void KeyUpdate() { if (Input.GetKeyDown(KeyCode.Alpha1)) { UseBandage(); } } private void UseBandage() { Hp += 10; }
-
同时绷带有个限制就是最高只能到75的血
if (Hp > 75) Hp = 75;
-
当血量大于75 是无法使用绷带的 可以给一个提示 进行return 就是进行返回 后面的就不执行
if (Hp > 75) { Debug.Log("无法使用绷带"); return; }
-
按键0
按下0.png
-
因为暂时没有场景和界面 增加一个小功能就是 想受虐的时候按下0 会损失一定血量 随机掉学
-
定义一个方法 在update中调用
BeFight();
-
当按下0键 同理 如何随机 定义一个可以容纳随机数值的变量 Random.range有两个重载方法
private void BeFight() { if (Input.GetKeyDown(KeyCode.Alpha0)) { }
}
-
下面执行的语句就是随机生成一个随机数 并让血量进行变化
if (Input.GetKeyDown(KeyCode.Alpha0)) { int damage = UnityEngine.Random.Range(0, Hp); Hp -= damage; Debug.Log("你被打了,现在的血量是:" + Hp); }
思路分析
思路分析.png- 相应的地方可以加上debug 进行提示 在没有UI的情况下
视频索引
- 文档细节OnMouseEnter如何检查光标落在物体上 举例讲解
视频 00:38:00——00:45:00 - 如何修改物体的颜色
视频 00:46:00——00:48:00 - highlight新建脚本 并保存场景
视频 00:49:00——01:04:00 - 吃药回血
视频 01:14:00——02:13:00 - 答疑
视频 02:14:00 - time.deltatime
视频 02:22:00
作业
- 完善代码
网友评论