嗨,老师不错,但是太幼稚了:)。 此类任务过于复杂,难以扩展。 并且需要在具有统一3D功能的组件系统中进行思考。
团结的力量是一个很酷的编辑器。 不要再在老式的肮脏编程中思考了,而是通过使用编辑器开始通过代码进行设置! 但是,我也不太喜欢mecanim动画师,因此我以统一的方式展示了第二个变体的示例。 我们不想使用补间,我们想手工构建某种补间。
- GMCloud和GameMaker第1部分:注册游戏
- PUBG PS4在公共测试服务器中获得Vikendi Snow Map,PS4 Pro图形选项
- 开发者权衡游戏的未来
- 独立任务-第十周; 重构
- 在UE4中重新创建分区
- 动画并不复杂:只需将对象Cursor从位置A移到位置B。澄清对象Cursor就是Transform。 A和B或C是Button元素(但它们具有Transform组件)。
- 我们不需要计算元素的位置-我们可以在其中进行包含位置的变换。
- 我们不知道我们有多少元素(在编程阶段),但是我们拥有所有这些元素的列表。
- 每个人都喜欢定制
有了清单,我们开始开发很酷的动画🙂
首先,我们需要添加我们需要播放的所有对象,光标和按钮。 这将是一个光标转换和按钮数组。
[SerializeField]
专用转换光标;
[SerializeField]
私人 Button []按钮;
我们添加注释[SerializeField],因为该字段是私有的,因为当有人从组件外部更改变量时,我们不想发生任何意外的行为,我们希望通过编辑器进行设置。 并且下面的所有代码都遵循该规则。
由于清单中的项目4,我们添加了一些黑魔法:
[SerializeField]
专用 AnimationCurve曲线= AnimationCurve。 EaseInOut (0,0,1,1);
[SerializeField]
私人浮动速度= 5f;
这是AnimationCurve(什么也没说)和不可思议的可变速度,在不久的将来将设置动画速度。 接下来是一些工作马,这些变量为我们的目的存储了一些数据:
私人浮动时间= 1f;
私有 Vector3以前的版本;
私有 Vector3接下来;
时间,光标的先前位置和光标的期望位置。 足够无聊的变量,开始编码方法! 首先,我们需要正确初始化元素。 因此,我们开始编写Start方法。
私人void Start(){
foreach (按钮中的按钮按钮)
button.onClick.AddListener(Clicked);
以前的= cursor.position; //在这里我们可以捕获异常
}
Iw非常简单。 我们遍历按钮数组,并添加一个名称为“ Clicked”的事件侦听器(这是不带参数的常规方法)。 在最后一行中,我们将先前的位置设置为光标位置,但是没有必要添加此方法以捕获异常,如果光标没有像组件初始化时一样快的话(相反,单击某处时会捕获该异常)。 这是我的一种怪异:)。 好的,我们初始化了组件,但是没有“ Clicked”方法! 让我们做吧!
私人void Clicked(){
转换按钮= EventSystem。 current .currentSelectedGameObject.transform;
MoveTo(button.position);
}
在第一行代码中,我们通过一些怪异的构造对当前选定的游戏对象进行了转换,没关系,我只是在五分钟前将其搜索到了堆栈溢出:)。 我们不需要检查该变量是否为空,因为当有人单击我们的按钮时,我们将调用该方法。 它保证不为空。 在第二行,我们使用按钮位置调用简单的方法MoveTo,让我们看一下该方法:
私人void MoveTo(Vector3 position){
下一个=位置;
以前的= cursor.position;
时间= 0f;
}
它采用元素的向量位置,将其保存在“下一个”变量中,将当前光标位置保存在上一个变量中,并将时间变量设置为零。 看起来很简单! 但是我们的魔力在哪里? 这是我们的最后一种方法。 准备? 这里是:
私人无效 Update(){
如果 (时间<1f){
时间+ =时间。 deltaTime *速度;
cursor.position = Vector3。 勒普 (
上一页下一页,
curve.Evaluate(time));
}
}
Pffff…这只是更新,任何人都知道! 🙂好吧,我们在那里做什么? 我们检查时间是否小于1,如果小于1,我们进行一些计算。 首先,我们添加一些deltaTime(游戏在帧之间花费的时间)乘以速度-不是神奇的! 但是,在下一行,我们要做一些奇怪的事情! 什么是Vector3.Lerp?什么是曲线?求值? 关于它的所有内容,我们都可以在unity docs上阅读,但是正如我在这里一样,我可以通过对它的理解来解释。 Lerp-使值通过线性规则从一个值更改为另一个值。 第三个论点是进度的百分比。 例如,我们需要知道50%的3到5的值是多少? 那是4点。🙂哦,读文档。 curve.Evaluate花一些时间在曲线上查看我们在编辑器中绘制的内容,然后从曲线的Y分量中获取一个值并返回。 只需玩大约五分钟,您就会明白它的作用。
完整代码如下。 只需48行代码和一个命名空间就可以了。 为了正常工作,我们需要从新的ui系统和光标创建一些按钮。 我们可以将其组件添加到任何对象。



使用 UnityEngine;
使用 UnityEngine.UI;
使用 UnityEngine.EventSystems;
公共类 UiMenuElementAnimation:MonoBehaviour {
[SerializeField]
专用 AnimationCurve曲线= AnimationCurve。 EaseInOut (0f,0f,1f,1f);
[SerializeField]
私人浮动速度= 5f;
[SerializeField]
专用转换光标;
[SerializeField]
私人 Button []按钮;
私人浮动时间= 1f;
私有 Vector3以前的版本;
私有 Vector3接下来;
私人void Start(){
foreach (按钮中的按钮按钮)
button.onClick.AddListener(Clicked);
以前的= cursor.position;
}
私人void Clicked(){
转换按钮= EventSystem。 current .currentSelectedGameObject.transform;
MoveTo(button.position);
}
私人void MoveTo(Vector3 position){
下一个=位置;
以前的= cursor.position;
时间= 0f;
}
私人无效 Update(){
如果 (时间<1f){
时间+ =时间。 deltaTime *速度;
cursor.position = Vector3。 勒普 (上一条,下一条,曲线。评估(时间));
}
}
}