Unity官方教程《秘密行动》学习笔记

本文详细介绍了Unity游戏中的敌方AI跟踪系统,包括标签管理、游戏控制器、摄像机移动和导航网格路径长度计算。通过示例代码展示了如何利用`Tag`系统寻找游戏对象,控制灯光、音乐和警报效果,以及如何实现平滑的摄像机跟随和计算两个向量间的角度,为游戏中的角色动画提供依据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、tag管理

//Tags.cs

using UnityEngine;
using System.Collections;
 
public class Tags : MonoBehaviour
{
    // A list of tag strings.
    public const string player = "Player";
    public const string alarm = "AlarmLight";
    public const string siren = "Siren";
    public const string gameController = "GameController";
    public const string mainLight = "MainLight";
    public const string fader = "Fader";
    public const string enemy = "Enemy";

}

2、游戏控制器

//LastPlayerSighting.cs
using UnityEngine;
using System.Collections;
 
public class LastPlayerSighting : MonoBehaviour
{
    public Vector3 position = new Vector3(1000f, 1000f, 1000f);         // 敌人或摄像机最后发现玩家的位置
    public Vector3 resetPosition = new Vector3(1000f, 1000f, 1000f);    // 重置坐标为默认位置 也就是说玩家没有被发现
    public float lightHighIntensity = 0.25f;                            // 主灯光的最大强度
    public float lightLowIntensity = 0f;                                // 主灯光的最小强度
    public float fadeSpeed = 7f;                                        // 主灯光的强度变化速度
    public float musicFadeSpeed = 1f;                                   // 背景音乐音量的变化速度
 
    private AlarmLight alarm;                                           // "AlarmLight"脚本引用
    private Light mainLight;                                            // 主灯光引用
    private AudioSource panicAudio;                                     // 紧张氛围的背景音乐"Audio Source"组件引用
    private AudioSource[] sirens;                                       // 警报喇叭引用(数组)
 
    void Awake ()
    {
        // 找到"Tag"为"alarm"的对象,获取包含的"AlarmLight"脚本组件引用
        alarm = GameObject.FindGameObjectWithTag(Tags.alarm).GetComponent<AlarmLight>();
         
        // 找到"Tag"为"mainLight"的对象,获取包含的灯光组件引用
        mainLight = GameObject.FindGameObjectWithTag(Tags.mainLight).light;
         
        // 在"Game Controller"和其子元素中查找名字为"secondaryMusic"的对象,获取音频组件引用
        panicAudio = transform.Find("secondaryMusic").audio;
         
        // 查找所有"Tag"为"siren"的对象,并依次储存到一个数组中
        GameObject[] sirenGameObjects = GameObject.FindGameObjectsWithTag(Tags.siren);
         
        // 让数组"sirens"与"sirenGameObejcets"的长度相同
        sirens = new AudioSource[sirenGameObjects.Length];
         
        // 获取所有"sirenGameObjects"数组中的对象的音频组件引用,并储存到"sirens"数组中
        for(int i = 0; i < sirens.Length; i++)
        {
            sirens[i] = sirenGameObjects[i].audio;
        }
    }
 
    void Update ()
    {
        // 调用两个函数控制警报开关和背景音乐切换
        SwitchAlarms();
        MusicFading();
    }
 
    void SwitchAlarms ()
    {
        // 通过玩家位置判断警报器是否开启,当玩家坐标为(1000, 1000, 1000)时 返回值为false 不开启,否则开启警报器
        alarm.alarmOn = (position != resetPosition);
         
        //主灯光的目标强度
        float newIntensity;
         
        // 如果警报灯开启
        if(position != resetPosition)
            // 主灯光的目标强度设为最小强度
            newIntensity = lightLowIntensity;
        else
            // 否则 主灯光的目标强度设为最大强度
            newIntensity = lightHighIntensity;
         
        // 让主灯光从当前强度渐变至目标强度
        mainLight.intensity = Mathf.Lerp(mainLight.intensity, newIntensity, fadeSpeed * Time.deltaTime);
         
        // 对于所有警报喇叭
        for(int i = 0; i < sirens.Length; i++)
        {
            // 如果警报开启且警笛声没有播放,则播放警笛声
            if(position != resetPosition && !sirens[i].isPlaying)
                sirens[i].Play();
            // 如果警报没有开启,则停止播放警笛声
            else if(position == resetPosition)
                sirens[i].Stop();
        }
    }
 
    void MusicFading ()
    {
        // 如果警报开启
        if(position != resetPosition)
        {
            // 减小背景音乐音量至0,
            a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值