基本思想:创建一个摄像机,实时渲染3D模型,将输出的结果展示在UI界面上。
但是摄像机渲染的内容是Render Texture,无法直接显示在UI组件上。
所以需要创建一个Render Texture作为中间件,接收摄像机的输出,并且赋值到UI中,那么就可以选用RawImage组件接收Texture。
接下来就是创建Canvas、Panel、RawImage,Camera、Texture的过程,最终目录结构如下
Texture就生成在资源目录,将摄像机的输出和RawImage的资源指向同一个就行。
最终结果如下,目前已经实现3D模型的显示,那么接下来为它添加旋转功能。
旋转模型的基本思想:
1.在模型显示区域,当鼠标按下时,记录模型当时的角度、鼠标的初始位置,进入旋转状态。
2.在鼠标持续按下时,旋转到对应的位置,这个位置根据鼠标的偏移值来算,如果是水平旋转则看x的偏移,如果是翻转,则看y的偏移,总之根据鼠标的差值计算。
3.在鼠标弹起时,回到正常状态。
代码实现:
public class AnimModelController : MonoBehaviour,IBeginDragHandler, IEndDragHandler, IDragHandler
{
public Transform modelTrans;
[Range(0.1f, 1f)]
public float rotateScale = 1;
bool isRotate;
Vector3 startPoint;
Vector3 startAnglel;
public void OnBeginDrag(PointerEventData eventData)
{
if (!isRotate)
{
isRotate = true;
startPoint = Input.mousePosition;
startAnglel = transform.eulerAngles;
}
}
public void OnEndDrag(PointerEventData eventData)
{
isRotate = false;
}
public void OnDrag(PointerEventData eventData)
{
if (!isRotate)
return;
var currentPoint = Input.mousePosition;
var x = startPoint.x - currentPoint.x;
modelTrans.eulerAngles = startAnglel + new Vector3(0, x * rotateScale, 0);
}
}
监听鼠标拖拽事件可以实现IBeginDragHandler, IEndDragHandler, IDragHandler接口;
也可以在游戏物体上添加Event Trigger组件,在指定三个拖拽响应的方法。
旋转的灵敏度参数可以通过rotateScale在Inspector调整。