改进
对话代码
之前的对白显示代码有一点小问题,需要稍作修改。
if (Time.time - instantiateTime >= continueTime && !spanning)
disappearing = true;
如图所示,之前是没有spanning的判定条件的,这会导致脚本不断把disappear值设为真,导致后续对话无法显示。
鼠标指针
在游戏中,我们用准星来代替鼠标指针,所以我们需要隐藏指针并将其锁定,在角色移动代码的Start函数中加入如下两行代码:
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
当然,为了方便测试,我们在测试过程中会暂时将这两行代码注释掉。
获得当前道具
有时我们需要获得当前道具编号,但是getItem函数存在一种特殊情况——当前没有任何道具,按照我们之前编写的代码,会造成indexOut类型的error,所以我们要稍加修改:
public int GetItem()
{
if (items.Count == 0)
return 0;
return items[num];
}
完成喷泉房间
置物架
上一次我们已经编写好了交互物体的脚本,这次我们直接将脚本拖动到需要互动的物体上即可。
首先是置物架,我们将脚本添加后修改参数如下:
值得注意的是,由于shelf本身是一个用来容纳各个组件的空物体,所以我们要手动添加Collider,才能让它被Raycast检测到,同时要修改其tag为Untouched。
之后我们要为架子上的部分物体添加玻璃材质,新建material,设置参数如下:
注意,一定要修改渲染模式为Fade,不然无法实现透明效果。
将材质赋予架子上的部分物体后,我们进入游戏检查一下:
我们如愿以偿得到了道具,点亮了灯光,并让特殊的玻璃杯消失,也出现了对白,置物架的实例摆放宣告成功。
喷泉
话不多说,先放上参数图:
如图,交互后出现的三个灯光分别是喷泉的有阴影灯光,无阴影灯光,以及隔壁房间保险柜的照明灯光。
另外因为喷泉下子物体的collider会影响射线检测,所以我们需要将子物体的collider移动到spring物体下。
喷泉灯光效果如下:
之后我们进入游戏看一看实际效果:
实际效果很成功,但是我们会发现一个问题——道具栏中的道具只有一个时,没有自动填充满,我们需要稍作修改。
道具添加代码修改
打开Item脚本的AddItem函数部分,修改部分代码如下:
if (items.Count == 1)
{
itemNowImg.sprite = img;
itemNextImg.sprite = img;
itemPrevImg.sprite = img;
}
这样道具个数变成一个时,就会填充满道具栏图标了。
密码解锁获得道具
用UI来实现输入密码
我们的保险柜为密码锁,所以我们需要实现密码解锁保险柜获得钥匙的功能,然而只使用我们之前所编写的Contact脚本无法完成这个功能,需要专门为它编写新的脚本。
首先我们还是把脚本添加给保险柜,但是由于我们点击保险柜不会得到任何道具,所以选择类型4,也不会有对话产生,我们唯一需要让交互做的就是生成UI界面。
因此我们需要制作一张新的画布命名为Password,将其拖动到保险柜的ShowObject数组下,剩下的就是设置好UI界面后编写脚本了!
设置UI界面
关于UI界面,我想要做出四个拨盘的密码锁效果,图片如下:
密码锁代码
图中有几个需要实现的功能,我将一一列举出来并附上代码。
首先是挂载在canvas画布上的脚本需要声明的变量:
[Header("Manu")]
public GameObject character;
public GameObject item;
public GameObject itemBox;
public GameObject dialogPrefeb;
[Header("Change