因为想要剖开重建网格,看一下内部的信息,所以需要传递平面的移动信息。
委托:委托是一个类型安全的函数指针,用于引用方法。它允许将方法作为参数进行传递。
事件:事件是委托的包装,提供了一种发布/订阅的机制。它允许一个类或对象通知其他类或对象某个事件发生。
事件 OnMoveValueChanged 会在 OnSliderValueChanged 方法中被触发。因此,事件会在每次 OnSliderValueChanged 方法执行时触发。
以下是平面挂载的代码
public class MovePlane : MonoBehaviour
{
public Slider slider;
internal float MoveValue = 2.0f;
// 定义委托和事件
public delegate void MoveValueChanged(float newValue);
public static event MoveValueChanged OnMoveValueChanged;
void Update()
{
OnSliderValueChanged();
}
public float OnSliderValueChanged()
{
// 计算新的Y轴位置
MoveValue = (float)(slider.value * 4.75);
// 更新平面对象的Y轴位置
Vector3 newPosition = this.transform.position;
newPosition.z = MoveValue;
this.transform.position = newPosition;
// 触发事件
OnMoveValueChanged?.Invoke(MoveValue);
return MoveValue;
}
}
OnMoveValueChanged是定义的事件。
?. 操作符是 C# 6.0 引入的可空操作符(null-conditional operator)。它用于在调用前检查左侧的对象是否为 null。如果 OnMoveValueChanged 为 null,它将跳过后面的 Invoke 方法调用,防止 NullReferenceException 异常。
Invoke(MoveValue)是触发事件的方法,向所有订阅者传递 MoveValue 作为参数。
在text上挂载以下代码
public class 获取滑动条数值 : MonoBehaviour
{
public Text text;
void OnEnable()
{
// 订阅事件
MovePlane.OnMoveValueChanged += UpdateText;
}
void OnDisable()
{
// 取消订阅事件
MovePlane.OnMoveValueChanged -= UpdateText;
}
void UpdateText(float newValue)
{
// 更新Text对象
text.text = $"重构高度位置:{newValue}";
}
}
StartCoroutine 启动的协程在 Unity 的主线程上运行,它的执行频率和 Update 方法类似,但具体的执行次数和频率取决于协程内部的 yield return 语句以及协程的逻辑。
当 StartCoroutine 被调用时,协程会立即开始执行,直到遇到第一个 yield return 语句为止。
yield return new WaitForSeconds(1f);
等待一秒继续执行协程。