720云部分功能在Unity中的制作(3)——点击物体使物体放大至屏幕中间并且可以旋转该物体

文章介绍了如何在Unity3D中通过修改CameraMode脚本来实现点击物体使其放大至屏幕中央并允许旋转。通过切换mode值和封装函数控制交互模式,使用鼠标右键旋转物体。此外,当点击物体时,通过碰撞检测判断是否播放或暂停关联的视频,实现了交互式的3D模型查看体验。
摘要由CSDN通过智能技术生成

一、点击物体使物体放大至屏幕中间并且可以旋转该物体

这一节我们要回到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")

效果图如下,物体移动的方向取决于场景中物体的坐标方向。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值