目录
- 机关房间制作
- 门锁脚本挂载
- 空气墙
- 声音
- AudioSource介绍
- 生成声音与声音消失
机关房间制作
门锁脚本挂载
我们剩余的工作量已经所剩无几,只需要将门锁挂载给机关房间即刻,我们摆放好物体后,为门锁挂载BeContact脚本,并添加一个物体专门让门锁消失,消失的脚本如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjFade : MonoBehaviour
{
public GameObject obj;
public float fadeTime;
private float fadeSpeed;
private Material mt;
private void Start()
{
fadeSpeed = 1 / fadeTime;
mt = obj.GetComponent<MeshRenderer>().material;
}
private void Update()
{
mt.color -= new Color(0, 0, 0, fadeSpeed * Time.deltaTime);
if (mt.color.a <= 0)
{
Destroy(obj);
enabled = false;
}
}
}
之后将此脚本挂载在一个空物体上,控制门锁和门渐隐,具体的处理就不再赘述,用同样的方法为机关房添加一个监测区域,用来检测是否将水倒入坑中。
空气墙
因为水坑是禁止玩家跳入的,所以要在水坑上方制作一堵空气墙,首先先放置一个正方体在目标位置,之后新建一个material,将其类型修改为Fade或者Transparent,以便显示透明材质,将颜色透明度调为0,把材质赋给空气墙,就可以产生一堵透明的墙了。
因为空气墙会阻挡射线检测,因此我直接把空气墙的collider作为了检测区域,只要点击时身上带有水瓶,就会填满池子并触发机关,水池上升我采取了设置一个水蓝色的透明正方体上升的方式,脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaterShow : MonoBehaviour
{
public GameObject water;
public float moveSpeed;
public float upHeight;
private Vector3 startPos;
private void Start()
{
startPos = water.transform.position;
}
private void Update()
{
water.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);
if (water.transform.position.y >= startPos.y + upHeight)
enabled = false;
}
}
很简单的代码,效果却很好,这样一来关卡的制作就完成了。
声音
AudioSource介绍
首先还是介绍一下AudioSource的所有参数吧:
AudioClip:声音素材文件
OutPut:输出,默认为Main Camera
Mute:静音
Bypass Effects:音源滤波开关
Bypass Listener Effects:监听器滤波开关
Bypass Reverb Zones:回音混淆开关
Play On Awake:启动时自动播放
Loop:循环播放
Priority:播放优先级
Volumn:音量
Pitch:音调
Stereo Pan:声道占比
Spatial Blend:空间混合
Reverb Zone Mix:回音混合
Doppler Level:多普勒效应强度
Spread:传播角度
Min/Max Distance:最小/大距离
Rolloff Mode:衰减模式
Logarithmic/Linear/Custom Rolloff:对数/线性/自定义衰减
因为我们的游戏要让玩家通过距离来寻找物体,所以我们需要加强声音在远处的大小,稍微调整图像,端点调整方式与ps中的钢笔工具一样。
生成声音与声音消失
这似乎是一个新的问题,但实际上我们之前编写BeContacted脚本的时候已经考虑到了这一点,我们只需要制作一个只包含AudioSource组件的物体,并将其拖给BeContacted的ShowObjects就可以了,至于消失,因为我们希望声音渐隐,所以需要编写一个新的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioFade : MonoBehaviour
{
public GameObject audioPlayer;
public float fadeSpeed;
private AudioSource audio;
void Start()
{
audio = audioPlayer.GetComponent<AudioSource>();
}
void Update()
{
audio.volume -= fadeSpeed * Time.deltaTime;
if (audio.volume <= 0)
{
audio.Stop();
enabled = false;
}
}
}
之后将此脚本挂载给空物体,加入ShowObjects列表即可,在与物体交互后,脚本中获得的播放器物体会逐渐衰减并消失。
之后我们还需要为玩家添加脚步声,但我们并不希望玩家在任何时候都产生脚步声,比如跳跃或静止时,不会有脚步声的产生。
所以我们在玩家物体上挂在声音播放器,拖入脚步声,并对MoveController进行如下修改:
if ((Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && !audio.isPlaying && !jumping)
audio.Play();
if (!(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && audio.isPlaying)
audio.Stop();
if (Input.GetKeyDown(KeyCode.Space)&&!jumping)
{
gameObject.GetComponent<Rigidbody>().AddForce(new Vector3(0, 6.5f, 0), ForceMode.Impulse);
jumping = true;
audio.Stop();
Invoke("JumpAgain", jumpSpan);
}
之后为每个需要播放声音或者声音消失的交互添加对应组件的,我们就可以在游戏中听到声音了。
到这里,游戏的关卡制作已经基本告一段落了,之后就是功能拓展诸如小地图、背包等功能,以及关卡切换功能。