Unity 游戏框架搭建 2019 (十八~二十) 概率函数 & GameObject 显示、隐藏简化 & 第二章 小结与快速复习
在笔者刚做项目的时候,遇到了一个需求。第一个项目是一个跑酷游戏,而跑酷游戏是需要一条一条跑道拼接成的。每个跑道的长度是固定的,而怪物的出现位置也是在跑道上固定好的。那么怪物出现的概率决定一部分关卡的难度。
以上有点绕,其实就是,到某一个时刻,怪物是否要出现。而是否要出现是根据概率来决定的。如果一个怪物出现的概率是 100%,那么每次到达跑道固定的位置时候都要生成怪物。如果是 80% 那么就有百分之二十的几率不生成怪物。
那么如何去写这个逻辑呢?
我们先分析一下,我们要输入的是一个概率,而得出的结果呢,是是否要生成怪物。所以我们可以确定下来返回值呢,是一个 bool 值,而输入值呢是一个数字。
而概率用百分比表示相比用 0 ~ 1的概率值表示更容易被理解。而整数的计算比 float 的计算性能更好,所以要输入的是一个 0 到 100 区间内的 int 类型。
到这里呢一个方法的输入输出,我们就这样搞定了。
代码如下:
public static bool Percent(int percent)
{
}
到这里,要用到一个随机数生成的 API。UnityEngine.Random.Range(int min,int max)。
完整的逻辑实现如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class PercentFunction : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/12.概率函数")]
#endif
private static void MenuClicked()
{
Debug.Log(Percent(50));
}
/// <summary>
/// 输入百分比返回是否命中概率
/// </summary>
public static bool Percent(int percent)
{
return Random.Range (0, 100) <= percent;
}
}
}
输出结果为,有一半的概率会输出 true。
结果是正确的。
今天就这些,我们又可以进行导出了。
小结
这篇文章中的示例其实是非常简单的,但是重点在于一个方法的设计。笔者呢给大家总结如下:
- 如果是没掌握的知识,可以先写示例,把示例写出来,写出来之后再去思考示例中的代码哪些是经常更改的,经常更改的值呢可以作为我们要设计的方法的参数。按照这个步骤一个合格的方法就设计出来了。
- 如果是已经掌握的知识,这个时候设计方法的目的大多数是为了实现某个逻辑,比如本篇文章的示例就是此情况,在这种情况下我们要做的当然是对这个逻辑进行一番分析,要分析出来可能要用到哪些 API,接着要思考输入什么和输出什么,这些梳理清楚了,一个比较合格的方法就设计出来了。
当然,在以后呢,笔者深入去聊这方面的东西,所以在这里大家只要尽量去理解就好,不用达到完全按照以上结论去做。
GameObject 显示、隐藏简化
我们在做项目的时候,经常会写如下的代码。
gameObject.SetActive(true);
gameObject.SetActive(false);
active 意思是激活,其实是比较贴切的。
但是笔者是从其他平台转过来的,最初想找到隐藏/显示 GameObject 的时候有点那么不适应。
像 Cocos2d 的显示是 Visible (可以看见的),而 iOS 的则是 Hidden(隐藏),Quick-Cocos2d-x 的则是 Show/Hide 等等,唯独 Unity 叫做 active,对刚接触 Unity 笔者来讲,其实很费解。
所以笔者自然就对 gameObject.active 下手了,用方法封装了一下 Show 和 Hide。
而命名则使用了 Show 和 Hide。
代码如下:
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class GameObejctActiveImprovements
{
#if UNITY_EDITOR
[MenuItem("QFramework/13.GameObejct 的显示、隐藏简化")]
#endif
private static void MenuClicked()
{
var gameObject = new GameObject();
Hide(gameObject);
}
public static void Show(GameObject gameObj)
{
gameObj.SetActive(true);
}
public static void Hide(GameObject gameObj)
{
gameObj.SetActive(false);
}
}
}
这段代码执行之后,会在场景中创建一个隐藏的 GameObject,如下图所示。

OK,今天的内容就这些。
小结
今天的示例代码,看似很简单,其实对于库的搭建来讲内容比较超前了,为什么这么讲呢?
实际上,今天是对我们的编码体验做了一点优化,而这个编码体验是笔者自己的体验,但是这个呢是要对代码非常敏感或者有大量编码经验的人才会注意到这样一点点细微问题。不过因为代码本身比较简单,所以对搭建框架或者库的初期比较适合大家实践。
第二章 小结与快速复习

转载请注明地址:凉鞋的笔记:liangxiegame.com
更多内容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
Unity 进阶小班:
- 主要训练内容:
- 框架搭建训练(第一年)
- 跟着案例学 Shader(第一年)
- 副业的孵化(第二年、第三年)
- 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
- 主要训练内容:
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

Unity 游戏框架搭建 2019 (十八~二十) 概率函数 & GameObject 显示、隐藏简化 & 第二章 小结与快速复习的更多相关文章
- Unity 游戏框架搭建 2019 (五十二~五十四) 什么是库?&第四章总结&第五章简介
在上一篇,我们对框架和架构进行了一点探讨.我们在这一篇再接着探讨. 什么是库呢? 来自同一位大神的解释: 库, 插到 既有 架构 中, 补充 特定 功能. 很形象,库就是搞这个的.我们的库最初存在的目 ...
- Unity 游戏框架搭建 2019 (三十六~三十八) partial与public
在上一篇,我们把菜单的顺序从头到尾整理了一遍.在整理菜单顺序的过程中,记录了一个要做的事情. 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 整理完菜单顺序后,学习新的知识,解决随着示例 ...
- Unity 游戏框架搭建 2019 (二十七、二十八)弃用的代码警告解决&弃用的代码删除
在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...
- Unity 游戏框架搭建 2019 (九~十二) 第一章小结&第二章简介&第八个示例
第一章小结 为了强化教程的重点,会在合适的时候进行总结与快速复习. 第二章 简介 在第一章我们做了知识库的准备,从而让我们更高效地收集示例. 在第二章,我们就用准备好的导出工具试着收集几个示例,这些示 ...
- Unity 游戏框架搭建 2019 (二十一、二十二) 第三章简介&整理前的准备
整理前的准备 到目前为止,我们积攒了很多示例了,并且每个示例也都贯彻了最的约定和规则. 在上一篇的小结也说了一个比较新的东西:编程体验优化. 在之前我们还积攒了一个问题:代码重复问题. 我们可是忍住整 ...
- Unity 游戏框架搭建 2019 (二十六) 第一轮整理完结
昨天呢我们把第八个示例整理完了.整理之后学习了类的第一作用:方法的集合,还有 Obselete 这个 API.并且在进行整理的时候贯彻了我们新的约定和规则:先确保功能有效,再去做变更和删除. 今天我们 ...
- Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性
在上一篇我们整理到了第七个示例,我们今天再接着往下整理.我们来看第八个示例: #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; ...
- Unity 游戏框架搭建 2019 (二十九) 方法所在类命名问题诞生的原因
我们在整理阶段解决了一些意外的问题.但是这些问题仅仅只是被解决而已,我们并没有去思考过这些问题是为什么产生的?以及在以后我们如何去避免这些问题的产生? 方法所在类的命名问题,最后我们通过方法分类解决了 ...
- Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名
昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整. 我们今天再往下接着调整. 我们来看下接下来的 MenuItem 代码如下: [MenuItem("QFramework/ ...
随机推荐
- DSO 运行 —— dso_ros + Android 手机摄像头
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12425855.html 本文要点: dso 配置安装 dso 离线 ...
- 正式学习MVC 06
1.Model常用属性讲解 using System; using System.ComponentModel.DataAnnotations; namespace MVCStudy2.Models ...
- handlebar.js模板引擎(轻页面小工程可用)
介绍 Handlebars 让你能够有能力高效地容易地创立语义化的模版.Handlebars兼容Mustache语法,在大多数情况下它可以读取Mustache的语法并在你当前模板中使用.具体点击这里 ...
- clientWidth offsetWidth等视窗尺寸
clientWidth和offsetWidth clientWidth 是一个只读属性,返回元素的内部宽度,该属性包括内边距,但不包括垂直滚动条(如果有).边框和外边距. offsetWidth 是一 ...
- Ubuntu 系统下如何安装pip3工具
一.[导读]Ubuntu 系统内置了 Python2 和 Python3 两个版本的开发环境,却没有内置相应的 pip3 管理工具,本文将介绍如何在Ubuntu下如何快速安装 pip3 工具,并升级到 ...
- python学习基础知识
学习python前最好知道的知识点: python之父:Guido van Rossum python是一种面向对象语言 目前python最新的版本是3.8,python2已经逐渐淘汰 python的 ...
- MDI设置父子窗体
1.新建父窗体,设置窗体属性:IsMdicontainer设置成true; 2.拖入button控件,修改button中的text. 3.点击button控件设置代码: //1.窗体实例化 Form ...
- 简说Python之flask-SQLAlchmey的web应用
目录 原生语句操作MySQL数据库 1.安装MySQL 2.MySQL设置用户和权限 3.用PyMySQL操纵MySQL数据库 4. CRUD增,删,改,查 使用SQLAlchemy 1.安装SQLA ...
- vue 模板 template init
<template> <div> </div> </template> <script> export default { name: '模 ...
- 【Java面试题】List如何一边遍历,一边删除?
这是最近面试时被问到的1道面试题,本篇博客对此问题进行总结分享. 1. 新手常犯的错误 可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的: public static void mai ...