using UnityEngine;
public class RaycastRote : MonoBehaviour,
IPicoRaycastPointerEnterHandler,
IPicoRaycastPointerStayHandler,
IPicoRaycastPointerExitHandler,
IPicoRaycastPointerDownHandler,
IPicoRaycastPointerUpHandler
{
public Transform RoteObj;
public Transform RoteObjOldParent;
bool isDown = false;
public void OnPointerDown(PicoRaycastEventData eventData)
{
isDown = true;
}
public void OnPointerEnter(PicoRaycastEventData eventData)
{
}
public void OnPointerExit(PicoRaycastEventData eventData)
{
isDown = false;
}
public void OnPointerStay(PicoRaycastEventData eventData)
{
if (isDown)
{
transform.LookAt(eventData.worldPosition);
RoteObj.SetParent(transform);
}
}
public void OnPointerUp(PicoRaycastEventData eventData)
{
isDown = false;
RoteObj.SetParent(RoteObjOldParent);
}
}
使用手柄射线或者激光射线滑动使物体沿着射线滑动轨迹旋转,
用于VR项目或非屏幕滑动交互,比如手上拿着一个激光笔,当照射到目标物体,
按下按钮滑动激光笔旋转目标物体,
RaycastRote这个脚本挂在球形碰撞器上碰撞器大小最好能包裹住旋转的RoteObj物体
射线在碰撞器上按下并滑动,方法transform.LookAt(eventData.worldPosition)在旋转transform的同时
用RoteObj.SetParent(transform)方法旋转了子对象RoteObj物体,eventData.worldPosition是射线和碰撞器接触的点的世界坐标,相当于if (Physics.Raycast(_ray, out _hit))的_hit.point坐标。
手柄松开后RoteObj的父对象随便设置一个物体,这里设置的是RoteObjOldParent为父对象,只要不是当前脚本物体就行。
Sphere和RoteObj的世界坐标必须相同。最好是RoteObjOldParent物体和它们坐标也相同。
这个方法简单粗暴,很实用,记录一下避免忘记。