1 前言
- 用于记录给项目增加VR交互时遇到的问题 SYYXY项目开发时未考虑VR交互 采用的键鼠
2 描述:
- 由于在项目制作中只考虑了键鼠操作移动,包括Canvas面板中的Button组件(鼠标点击事件)
2.1 存在问题:
- 1、尝试碰撞检测进行代码触发(利用OncollisionEnter函数),但是Canvas面板中添加的Cube子物体,即使增加了Box Collider,在设置碰撞范围时都没有任何区域,Collider2D、Mesh Collider也没有作用(对于此处是否是本人理解有偏差 我不太确定 望指正)
- 2、不知道怎么用代码直接触发Button的按键操作,省去鼠标点击事件
3 解决
3.1 Box Collider没反应
- 解决办法:
不要直接在Canvas下创建物体,而是采取在外部创建,再拖回canvas
3.2 VR与Button交互
3.21 Ray射线
- 注意:Ray射线 在Scene面板中可见,Game面板中不可见
EXAMPLE
void Update()
{
Ray ray = new Ray(trackedObj.transform.position, trackedObj.transform.rotation.eulerAngles);
if (Physics.Raycast(ray, out hitInfo, 1000))
{
GameObject gameobj = hitInfo.collider.gameObject;
float distance = 0;
if (gameobj != null)
{
distance = Vector3.Distance(transform.position, gameobj.transform.position);
}
else
{
distance = 1;
}
LineRender.SetPosition(1, new Vector3(0, 0, distance));
}
3.22 SteamVR_Behavior_Pose
- 基于这个脚本,可以发出在Game面板中可见的射线,并在函数OnPointerClick()中增加碰撞逻辑,可以实现手柄与Button的交互。
- 脚本代码:
public virtual void OnPointerClick(PointerEventArgs e)
{
if (PointerClick != null)
PointerClick(this, e);
Ray raycast = new Ray(transform.position, transform.forward);
RaycastHit hit;
bool bHit = Physics.Raycast(raycast, out hit);
rayhit = hit;
Debug.Log("b");
if (Physics.Raycast(raycast, out hit))
{
Debug.Log(hit.transform.tag);
if(hit.transform.tag=="Switch")
{
Debug.Log("OK");
bnt = hit.transform.parent.GetComponent<Button>();
bnt.onClick.Invoke();
}
else if(hit.transform.tag == "ErrorDisplay")
{
bnt = hit.transform.parent.GetComponent<Button>();
bnt.onClick.Invoke();
}
}
- 需要注意,主动碰撞的Object需要刚体组件,否则不会有碰撞效果。