Unity——控制声效的音频控制面板在飞机停留在触发区播放背景音乐时出现和小地图显隐(11)

脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class J4_UI : MonoBehaviour
{
    public AudioSource audioSourceMoonLight;

    public Canvas Canvas_Overlay_Music;    // 音量控制面板
    public Slider Slider_volume;
    public Text Text_volume;

    public Canvas Canvas_WorldSpace_airplanPower; // 飞机能量面板
    public Slider Slider_power;
    public Text Text_power;

    public int maxPower = 10;
    public int currentPower = 0;
    public int stepPower = 2;

    public GameObject camera_Top;

    private RaycastHit hit;                // 射线碰撞检测
    private Vector3 rayOrigin;             // 射线发射源点
    public Color[] colors;                 // 颜色数组(Inspector 中配置)
    private Coroutine colorChangeCoroutine; // 颜色切换协程
    private int CoroutineStartFlag = 0;
    private int Camera_TopFlag = 1;

    void Start()
    {
        // 初始化音频
        audioSourceMoonLight.loop = true;
        audioSourceMoonLight.Stop();
        Canvas_Overlay_Music.gameObject.SetActive(false);

        // 固定音量初始值为 10%(文本显示“音量:1”)
        Text_volume.text = "音量:" + Mathf.Round(Slider_volume.value * 10);

        // 初始化能量条
        Slider_power.maxValue = maxPower;
        Slider_power.value = Mathf.Min(currentPower, maxPower);
        Text_power.text = "能量:" + Slider_power.value;
        Canvas_WorldSpace_airplanPower.gameObject.SetActive(true);

        // 初始化小地图摄像机
        camera_Top = GameObject.Find("Camera_Top");
        camera_Top.SetActive(true);
    }

    // 进入触发器时(仅处理音乐触发区)
    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("a"))
        {
            change_volume(Slider_volume.value); // 更新音量和文本
            
            if (!audioSourceMoonLight.isPlaying)
            {
                play_audio();
            }
            Canvas_Overlay_Music.gameObject.SetActive(true);
        }
    }

    // 触发区停留逻辑(仅处理能量增加)
    private int[] triggerStayFlag = new int[5]; // 默认全为 0
    void OnTriggerStay(Collider other)
    {
        string triggerName = other.gameObject.name;
        if (triggerName == "Trigger5_1" && triggerStayFlag[0] == 0)
        {
            currentPower += stepPower;
            triggerStayFlag[0] = 1;
        }
        else if (triggerName == "Trigger5_2" && triggerStayFlag[1] == 0)
        {
            currentPower += stepPower;
            triggerStayFlag[1] = 1;
        }
        else if (triggerName == "Trigger2_1" && triggerStayFlag[2] == 0)
        {
            currentPower += stepPower;
            triggerStayFlag[2] = 1;
        }
        else if (triggerName == "Trigger2_2" && triggerStayFlag[3] == 0)
        {
            currentPower += stepPower;
            triggerStayFlag[3] = 1;
        }
        else if (triggerName == "Trigger3_1" && triggerStayFlag[4] == 0)
        {
            currentPower += stepPower;
            triggerStayFlag[4] = 1;
        }

        // 更新能量条显示
        Slider_power.value = Mathf.Min(currentPower, maxPower);
        Text_power.text = "能量:" + Slider_power.value;
    }

    // 离开触发区
    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("a"))
        {
            mute();
            Canvas_Overlay_Music.gameObject.SetActive(false);
            Canvas_WorldSpace_airplanPower.gameObject.SetActive(true);
        }

        // 重置触发区标志(可选:如果需要重复触发能量增加)
        // for (int i = 0; i < triggerStayFlag.Length; i++) triggerStayFlag[i] = 0;
    }

    // 音频控制方法
    public void mute()
    {
        audioSourceMoonLight.Pause();
    }

    public void play_audio()
    {
        audioSourceMoonLight.volume = Slider_volume.value;
        if (!audioSourceMoonLight.isPlaying)
        {
            audioSourceMoonLight.Play();
        }
    }

    public void change_volume(float volume)
    {
        audioSourceMoonLight.volume = volume;
        Text_volume.text = "音量:" + Mathf.Round(volume * 10);
    }

    void Update()
    {
        // 小地图显隐控制
        if (Input.GetKeyDown(KeyCode.C))
        {
            camera_Top.SetActive(!camera_Top.activeSelf);
            Camera_TopFlag = camera_Top.activeSelf ? 1 : 0;
        }

        // 射线检测(颜色变化逻辑)
        rayOrigin = new Vector3(transform.position.x, transform.position.y, transform.position.z - 0.61f);
        if (Physics.Raycast(rayOrigin, transform.forward * (-1), out hit, 3f))
        {
            if (hit.collider.name.StartsWith("Trigger5") && CoroutineStartFlag == 0)
            {
                StartColorTransition("Cube (1)");
            }
            else if (hit.collider.name.StartsWith("Trigger2") && CoroutineStartFlag == 0)
            {
                StartColorTransition("Cube");
            }
            else if (hit.collider.name.StartsWith("Trigger3") && CoroutineStartFlag == 0)
            {
                StartColorTransition("Cube (2)");
            }
            else if (!hit.collider.name.StartsWith("Trigger") && CoroutineStartFlag == 1)
            {
                StopColorTransition();
                CoroutineStartFlag = 0;
                ResetNumbersToWhite();
            }
        }
        else if (CoroutineStartFlag == 1)
        {
            StopColorTransition();
            CoroutineStartFlag = 0;
            ResetNumbersToWhite();
        }
    }

    // 颜色切换协程
    private IEnumerator ColorTransitionRoutine(string triggerName)
    {
        int currentColorIndex = 0;
        while (true)
        {
            GameObject.Find(triggerName).GetComponent<Renderer>().material.color = colors[currentColorIndex];
            yield return new WaitForSeconds(0.5f);
            currentColorIndex = (currentColorIndex + 1) % colors.Length;
        }
    }

    private void StartColorTransition(string triggerName)
    {
        if (colorChangeCoroutine != null) StopCoroutine(colorChangeCoroutine);
        CoroutineStartFlag = 1;
        colorChangeCoroutine = StartCoroutine(ColorTransitionRoutine(triggerName));
    }

    private void StopColorTransition()
    {
        if (colorChangeCoroutine != null)
        {
            StopCoroutine(colorChangeCoroutine);
            colorChangeCoroutine = null;
        }
    }

    private void ResetNumbersToWhite()
    {
        GameObject.Find("Cube").GetComponent<Renderer>().material.color = Color.white;
        GameObject.Find("Cube (1)").GetComponent<Renderer>().material.color = Color.white;
        GameObject.Find("Cube (2)").GetComponent<Renderer>().material.color = Color.white;
    }
}

挂载在飞机上

效果:

按键C,小地图显隐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值