目录

  • 机关房间制作
  • 门锁脚本挂载
  • 空气墙
  • 声音
  • 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的所有参数吧:

unity2d声音管理 unity关闭声音按钮_unity3d


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中的钢笔工具一样。

unity2d声音管理 unity关闭声音按钮_unity2d声音管理_02

生成声音与声音消失

这似乎是一个新的问题,但实际上我们之前编写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);
        }

之后为每个需要播放声音或者声音消失的交互添加对应组件的,我们就可以在游戏中听到声音了。
到这里,游戏的关卡制作已经基本告一段落了,之后就是功能拓展诸如小地图、背包等功能,以及关卡切换功能。