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。

结果是正确的。

今天就这些,我们又可以进行导出了。

小结

这篇文章中的示例其实是非常简单的,但是重点在于一个方法的设计。笔者呢给大家总结如下:

  1. 如果是没掌握的知识,可以先写示例,把示例写出来,写出来之后再去思考示例中的代码哪些是经常更改的,经常更改的值呢可以作为我们要设计的方法的参数。按照这个步骤一个合格的方法就设计出来了。
  2. 如果是已经掌握的知识,这个时候设计方法的目的大多数是为了实现某个逻辑,比如本篇文章的示例就是此情况,在这种情况下我们要做的当然是对这个逻辑进行一番分析,要分析出来可能要用到哪些 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,如下图所示。
006tNc79gy1fzdi32usd7j30i00860t6.jpg
OK,今天的内容就这些。

小结

今天的示例代码,看似很简单,其实对于库的搭建来讲内容比较超前了,为什么这么讲呢?

实际上,今天是对我们的编码体验做了一点优化,而这个编码体验是笔者自己的体验,但是这个呢是要对代码非常敏感或者有大量编码经验的人才会注意到这样一点点细微问题。不过因为代码本身比较简单,所以对搭建框架或者库的初期比较适合大家实践。

第二章 小结与快速复习

006tNc79gy1fzdi3hfk9tj311l0e378a.jpg

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

posted @ 2020-04-05 19:54  凉鞋的笔记  阅读(...)  评论(...编辑  收藏