Unity 游戏框架搭建 2019 (十七、十八) Transform 重置与概率函数

Kiran ·
更新时间:2024-11-10
· 697 次阅读

今天我们再往下接着探索,我们的 Transform。

我们经常要写这样的逻辑,对一个 Transform 的位置、旋转、缩放值进行重置。

代码如下:

transform.localPosition = Vector3.zero; transform.localScale = Vector3.one; transform.localRotation = Quaternion.identity;

代码大家应该经常会写到。

我们提取后的方法如下:

#if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace QFramework { public class TransformIdentity : MonoBehaviour { #if UNITY_EDITOR [MenuItem("QFramework/11.Transform 归一化")] #endif private static void MenuClicked() { var transform = new GameObject("transform").transform; Identity(transform); } /// /// 重置操作 /// /// Trans. public static void Identity(Transform transform) { transform.localPosition = Vector3.zero; transform.localScale = Vector3.one; transform.localRotation = Quaternion.identity; } } }

代码的执行结果是正确的。

那么有人会问 Identity 是什么意思呢?Identity 其实是一个矩阵的类型,对角线全部是 1 而其他的部分全部是 0,如下图所示。
006tNc79gy1fzdi20inapj302b03lgle.jpg

实际上 Transform 本质是一个 4x4 的矩阵,这个矩阵可以记录矩阵的位置、旋转和缩放值。而 Identity 矩阵对应的 Transform 就是位置为 0、缩放为 1、Rotation 值为 Quaternion.identity 这样的矩阵。

这里不太理解的同学不要紧,重点还是以上代码中的 Identity 方法的实现。

OK,到这里,我们又可以进行一次导出了。

到今天为止,我们收集了十一个示例了。收获满满,大家应该收集了更多的示例了吧?

概率函数

在笔者刚做项目的时候,遇到了一个需求。第一个项目是一个跑酷游戏,而跑酷游戏是需要一条一条跑道拼接成的。每个跑道的长度是固定的,而怪物的出现位置也是在跑道上固定好的。那么怪物出现的概率决定一部分关卡的难度。

以上有点绕,其实就是,到某一个时刻,怪物是否要出现。而是否要出现是根据概率来决定的。如果一个怪物出现的概率是 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)); } /// /// 输入百分比返回是否命中概率 /// public static bool Percent(int percent) { return Random.Range (0, 100) <= percent; } } }

输出结果为,有一半的概率会输出 true。

结果是正确的。

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

小结

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

如果是没掌握的知识,可以先写示例,把示例写出来,写出来之后再去思考示例中的代码哪些是经常更改的,经常更改的值呢可以作为我们要设计的方法的参数。按照这个步骤一个合格的方法就设计出来了。 如果是已经掌握的知识,这个时候设计方法的目的大多数是为了实现某个逻辑,比如本篇文章的示例就是此情况,在这种情况下我们要做的当然是对这个逻辑进行一番分析,要分析出来可能要用到哪些 API,接着要思考输入什么和输出什么,这些梳理清楚了,一个比较合格的方法就设计出来了。

当然,在以后呢,笔者深入去聊这方面的东西,所以在这里大家只要尽量去理解就好,不用达到完全按照以上结论去做。

今天的内容就这些,拜拜~

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

更多内容

QFramework 地址:https://github.com/liangxiegame/QFramework

QQ 交流群:623597263

Unity 进阶小班

主要训练内容: 框架搭建训练(第一年) 跟着案例学 Shader(第一年) 副业的孵化(第二年、第三年) 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro

关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。


作者:凉鞋的笔记



函数 transform unity 框架

需要 登录 后方可回复, 如果你还没有账号请 注册新账号