目录
(一)创建人物状态UI
(二)实现血条实时更新
(三)制作玩家特殊动作(滑墙与滑铲)
(四)摄像机制作
(五)音效和音源制作
(六)制作场景伤害和死亡判定
(一)创建人物状态UI
与canvas一同创建的EventSystem是控制所有ui事件的游戏对象,如果使用的是新版的InputSystem,可以将EventSystem的输入系统通过行为资源改为自己创建的输入系统。Canvas中Canvas组件用于调整画布模式,Canvas Scaler调整UI大小和适配分辨率等。
Canvas上的子UI对象依靠锚点来确定其在Canvas上(或其父对象上)的位置,子对象选择的锚点将作为对象坐标的原点,Also Set Position(Alt)会同时将坐标调整到对应位置,Also Set Pivot(shift)则会同时移动对象自身锚点到选定锚点。
unity Hierarchy中默认的叠层顺序是下层覆盖上层。
制作简单血条UI,需要设置框架图片和填充图片,将填充图片的图片模式设为填充,并通过脚本控制填充率。
制作头像或需要切割图片时,可以为被切割图片添加一个父image对象,并添加Mask组件来使其作为图像显示的切割幕布。
(二)实现血条实时更新
基本逻辑和之前3D基础教程中的血条相似,都是读取生命值百分比来设置fill amount,但是在此之上还实现了红色虚血的延迟下降。
血量数据需要跨物体传递,除了采用场景内寻找引用外,也可将数据存储到ScriptableObject型脚本中,及时跨场景也可继续使用。在上一个项目中ScriptableObject被用作存放各个数据,而这里则采用Event的形式来传递数据。在ScriptableObject类前添加[CreateAssetMenu]注解来在unity中可以直接创建对应的资产文件。进行事件的订阅时,可以在unity中编辑,也可以函数指针类似的形式"+=/-="来订阅,事件类型不止一种,包括Event、UnityAction等。
具体结构是,在ScriptableObject中编写事件与启动方法,并创建对应Asset;然后需要传递数据的脚本中创建事件,并让Asset中的启动方法订阅该事件,这样就以事件的形式将传递的数据进行广播;接下来让需要执行相关操作的脚本中的变量获取该Asset,即可接收到广播,从而执行操作。事件注册在OnEnable,取消注册在OnDisable中。整体的流程为:数据传递脚本激活自身事件,调用了Asset的启动事件方法,将Asset的事件激活,从而调用了执行具体操作的脚本的方法。
(三)制作玩家特殊动作(滑墙与滑铲)
制作滑墙与登墙跳需要明确动画状态的位置,补充物理检测。为防止出现空指针,当组件获取另一个可能不存在的组件时需要限定范围或获取条件。当遇到只执行一次的数据(如速度)会被Update中的操作覆盖时,一般通过设置状态变量的方式来限制数据的变动。
当制作滑铲这种一次预备动画和多次重复动画组成的动作时,可以与蜗牛的移动类似,分割成两个部分,当前半部分动作完成时自动转入下一部分动作,并在结束时转到Exit状态退出。协程一般用在等待某些行为的逻辑中,如果滑铲的实现逻辑包括了等待,如等待滑行到位置,那么就可以采取协程的写法。在FixUpdate中可以用滑铲的状态变量避免执行Move方法,这样可以防止滑铲过程中手动变向导致采用目标点形式的滑铲停不下来。调整对象图层则可以使用LayerMask.NameToLayer()来按照图层名更改从而避免碰撞。当希望跳跃方法能够打断某些协程操作(如跳跃打断滑铲)时,可以调用StopAllCoroutines()来打断运行中的所有协程。
(四)摄像机制作
Cinemachine常用于制作unity相机效果。
实现跟随效果使用的是Cinemachine中的虚拟摄像机,其Body中各个属性可以调整相机的活动情况,如视野位置和死区,死区是摄像机跟随的缓冲区域,只有离开此区域摄像机才会跟随。还可添加其他拓展组件,如改变虚拟摄像机的正交尺寸来确保像素分辨率的Cinemachine Pixel Perfect 扩展,限制摄像机移动边界的cinemachine confiner 2d等。cinemachine confiner 2d通过识别场景中的大型Trigger碰撞体来确认边界范围,如果没有效果可以尝试将碰撞体对象的scale调大,可通过脚本获取边界对象,但当切换边界形状时,需要先通过InvalidateCatch方法清除之前的缓存。cinemachine impulse listener则可以监听源并触发镜头震动,通过在对象上挂载cinemachine impulse source并在需要的脚本中去生成震动来控制镜头震动效果,振动的产生则与ui更新相同,采用中继事件的广播和监听形式实现。
(五)音效和音源制作
简单的音效由Audio Source和Audio Listener两部分构成,音源在场景中播放音效,而listener接受声音并在设备中播放。在设置攻击等音效时需要跨代码控制音源播放,也可以使用前面中继事件的方式,如在设置攻击音效时,在生成攻击判定时触发音效事件,播放指定音频片段。
注,当采用OnEnable执行脚本方法时,由于在加载场景时所有物体的OnEnable会被执行一次,因此一些挂载到空物体上的音乐在初始场景不会播放。
使用AudioMixer可以对音效进行混音。将音源的OutPut输出到AudioMixer的轨道上,就可以对音效进行调整,像是音量控制的选项也可以通过控制轨道来实现
(六)制作场景伤害和死亡判定
对于落水死亡和地刺受伤等制作,可采用制作敌人碰撞伤害的思路,使用碰撞体trigger的来触发伤害等效果,也可以直接将攻击脚本挂载到地刺上作为一个不动的敌人。
















