今天我们再往下接着探索,我们的 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);
}
/// <summary>
/// 重置操作
/// </summary>
/// <param name="trans">Trans.</param>
public static void Identity(Transform transform)
{
transform.localPosition = Vector3.zero;
transform.localScale = Vector3.one;
transform.localRotation = Quaternion.identity;
}
}
}
代码的执行结果是正确的。
那么有人会问 Identity 是什么意思呢?Identity 其实是一个矩阵的类型,对角线全部是 1 而其他的部分全部是 0,如下图所示。
实际上 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));
}
/// <summary>
/// 输入百分比返回是否命中概率
/// </summary>
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 获取第一时间更新通知及更多的免费内容。