脚本:
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,小地图显隐