查了很多UI交互的资料,除了官方案例之外,大多都写的很乱。于是自己写了一个十分简单的方法实现UI的交互,今天发出来共享一下。
大体思路:
第一步:画一条人眼可见的射线(使用LineRenderer,起点是手柄的中心点,方向是手柄的前方,射线长度可以自定义)
第二步:射线碰撞UI上的碰撞器(使用Physics.RaycastAll(),这个函数自身会发射一条人眼不可见的射线跟UI碰撞,并返回RaycastHit[] 数组,UI在最前面,raycasthit[0]就是UI)
第三步:得到raycasthit[0]后就可以写自己的UI业务代码了。
具体代码如下:
private RaycastHit[] hits;//UI必须要有碰撞器,可以没有刚体
private LineRenderer m_Line;
private void Start()
{
if (m_Line == null)
{
m_Line = gameObject.AddComponent<LineRenderer>();
Keyframe[] ks = new Keyframe[2];
ks[0] = new Keyframe(0, 0.007f);
ks[1] = new Keyframe(1, 0.007f);
m_Line.widthCurve = new AnimationCurve(ks);
m_Line.material = new Material(Shader.Find("Unlit/Color"));
m_Line.material.SetColor("_Color", new Color32(0, 255, 0, 255));
m_Line.SetPosition(0, Vector3.zero);//启动时候先生成射线,然后在update中实时刷新
//0代表射线的起点
m_Line.SetPosition(1, Vector3.zero);//1代表射线的终点
}
}
void Update()
{
m_Line.SetPosition(0, transform.position);//不停刷新手柄的射线
m_Line.SetPosition(1, transform.forward * 1000);//长度可以自己修改
hits = Physics.RaycastAll(transform.position, transform.forward, 100.0F);//系统和人均不可见的射线 ,长度可以自己修改
for (int i = 0; i < hits.Length; i++)
{
RaycastHit hit = hits[i];
print("碰撞物体是:" + hit.transform.name.ToString();
}
}