版权声明:转载 请说明 出处 https://blog.csdn.net/qq2512667/article/details/88544217
最近换了公司(仍然是实习狗),坐标在上海, 楼上是Unity总部。很开心~~
上海和广东差别 并不是很大。就是天气比较冷,口味偏甜, 这家公司是创业公司,做教育类应用的, VR/AR MR 等, 第一天 就要上手SDK,也不是很难,Zspace的 相对VRTK来说 比较 简单,开发工程中遇到Button交互,所以要对它进行 重写,设备是 用射线进行 探测,
其实 重写Button也比较简单,也可以不用重写, 但还是建议重写会比较好。
之前有写过射线交互的例子
https://blog.csdn.net/qq2512667/article/details/79493117
https://blog.csdn.net/qq2512667/article/details/79842850
原理都差不多的, 射线交互 现在用的挺多的,NGUI 用的就是射线探测,但UGUI不是,是根据坐标去判断的·。
Button 继承自 Selectable
官方源码
FormerlySerializedAs( "“onClick”)
ButtonClickEvent m_Onclick 这个特性就是备胎特性,当Onclick被删除
后, Onlickx序列化后就存在 m_Onclick 中
DoStateTransition(currentSelectionState, false);
这个 方法 比较重要,就是设置Button的交互转换状态,在重写的时候。需要用到这个方法。
这个方法就是转换 Button的状态
Selectable这个类 继承 UIBehaviour
重写思路,射线分为 射线进入, 射线停留,射线离开
因此 写3个方法 就可以了
public class RayButton : Button
{
public UnityEngine.Events.UnityEvent MenuUIEvent;
/// <summary>
/// 视线进入
/// </summary>
public virtual void RayEneter()
{
DoStateTransition(SelectionState.Highlighted, false);
}
/// <summary>
/// 视线停留
/// </summary>
public virtual void RayStay()
{
ReSetButtonState();
}
/// <summary>
/// 视线离开
/// </summary>
public virtual void RayExit()
{
DoStateTransition(SelectionState.Normal, false);
}
public virtual void TriggerEvent()
{
onClick.Invoke();//调用下 Click事件
DoStateTransition(SelectionState.Pressed, false);
}
/// <summary>
/// 事件完成
/// </summary>
public virtual void ReSetButtonState()
{
DoStateTransition(SelectionState.Highlighted, false);
}
}