点击物体使物体放大至屏幕中间并且可以旋转该物体
一、点击物体使物体放大至屏幕中间并且可以旋转该物体
这一节我们要回到CameraMode脚本中,详情可以移步第一节的内容:CameraMode脚本。会通过修改CameraMode脚本中mode的值来控制鼠标的操作,设定mode=1时为选取可操作物体的模式代号,并通过一个静态的GameObject来记录要操作控制的物体。
// 当前选取的物体
static GameObject interactiveThing;
随后会涉及到mode的切换,可以选择直接在功能函数中对mode进行赋值切换,但是mode切换的操作可能在后续多次使用,此处选择将mode切换编写为一个函数供后续调用。ModeChange()函数用于更改mode的值,后续mode值用于判断摄像机此时处于哪个显示模式,state是传入函数中的值。
public static void ModeChange(int state)
{
mode = state;
}
同理,鼠标在进行按下判断时也需要知晓mode的值,使用封装的GetMode ()函数用于获取到此时mode的值,只需要返回mode值即可。
public static int GetMode()
{
return mode;
}
SetInteractiveThing(GameObject o)函数将传入的GameObject赋值给上面的interactiveThing。该函数用于动态获得可交互物体。
public static void SetInteractiveThing(GameObject o)
{
interactiveThing = o;
}
在Update()函数中,如果此时是选取雕塑模式,则判断是否按住鼠标右键,若是,则根据鼠标的移动来控制雕塑的旋转。代码补充在if(mode==0)之后,作为另一个判断循环。
else if (mode == 1) //当是选取雕塑模式时
{
//如果按住鼠标右键
if (Input.GetMouseButton(1))
{
interactiveThing.transform.eulerAngles += new Vector3(-Input.GetAxis("Mouse Y") * 2, -Input.GetAxis("Mouse X") * 2, 0);
}
}
接下来编写挂载到可交互物体上的脚本,让可交互物体可以响应鼠标的点击事件。用的响应方式为碰撞检测,需要给可交互的物体上添加Collider组件,可以根据物体的形状和外观决定使用哪种Collider组件并调整碰撞体的大小至刚好覆盖住雕塑。
新建ModelInteration脚本,此脚本只需新建一个Transform类型数据,来记录物体原本的位置、旋转、缩放,然后在Start()函数中获取到物体的初始状态。
Transform originTransform;
// Start is called before the first frame update
void Start()
{
originTransform = new GameObject().transform;
}
随后编写鼠标左键对物体的交互。如果此时摄像机在正常模式,则先用originTransform记录物体原本的位置,transform的值为挂载有脚本的物体的transform的值,随后修改transform的值至摄像机前,然后利用CameraMode脚本中的ModeChange()函数来更改CameraMode脚本中的mode值为1,再设置挂载脚本的物体为CameraMode脚本中的可交互物体。如果此时摄像机观察物体的模式下,则把originTransform记录的物体原本位置的值赋值给挂载有脚本的物体的transform,然后更改mode值为0,同时取消掉挂载有脚本的物体的可交互参数。
private void OnMouseDown()
{
if (CameraMode.GetMode() == 0)
{
CopyTransform(transform, originTransform); //记录其原有位置
transform.position = Camera.main.transform.forward * 1.9f + Camera.main.transform.position; //设置其位置于摄像机前
CameraMode.ModeChange(1);
CameraMode.SetInteractiveThing(gameObject);
}
else if (CameraMode.GetMode() == 1)
{
CopyTransform(originTransform, transform); // 原 位 归 还
CameraMode.ModeChange(0);
CameraMode.SetInteractiveThing(null);
}
}
CopyTransform()函数用于交换两个originTransform和transform的值,将其封装为一个函数再调用可使代码内更加简洁。
// 赋值Transform的方法
void CopyTransform(Transform source, Transform destination)
{
destination.position = source.position;
destination.rotation = source.rotation;
destination.localScale = source.localScale;
}
将ModelInteration脚本挂载到任意想进行点击放大查看的物体上即可。
二、点击物体播放和暂停视频补充
在完成放大模型功能的制作后,点击模型时会使影音墙上的视频一起播放或暂停,解决方式是在ClickPlayVideo脚本中添加一个判断条件,用hit.collider.gameObject.name=="yingyingqiang"来判断摄像机发出的射线射中的是否是用于播放视频的影音墙,则再进行播放或暂停视频的操作。
if (Physics.Raycast(ray, out hit) && hit.collider.gameObject.name == "yingyingqiang")
效果图如下,物体移动的方向取决于场景中物体的坐标方向。