ChuanXin 发表于 2023-1-4 13:17

Unity战斗单元UI血条架构设计

1:如何选取技术方案
Unity战斗系统中,每个角色经常会有血条与昵称。如何架构设计才高效,我们列举一些常用的做法:


对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
方案(1)中onGUI的性能是很差的, 一般只用于显示一些调试相关的信息,不适合用来做正式的游戏物体。方案(2)中创建3D物体,然后对着摄像机,能实现功能,可能的问题就是血条昵称这样的物体,可能会打乱物体的合批,使得drawcall比较高, 昵称与血条的Shader也可能与角色的不一样,会有不断切换Shader, set bass call爆增的风险。所以在正式的项目里面会使用方案(3)的UGUI/NGUI来单独创建血条与昵称的UI节点,然后角色移动同时更新同步UI节点的位置。




2: 如何排布角色节点与UI血条








最后再做一个昵称+血条的UI对象,等角色创建的时候,再把这个对象创建出来,如图:


3 战斗系统中3D角色的UI代码设计
首先每个战斗单元,我们都会设计一个管理类提供策略,比如玩家对象,很多游戏会设计一个Player类来控制玩家, Boss怪会设计一个BossEnemy的类来控制Boss,而Player, Boss需要的很多策略,有些是共用的,血条就是其中之一,所以一般Player与Boss都会继承自一个策略基类FightCharactor,我们就可以把战斗掉血,吃道具加血以及UI血条的机制策略设计到FightCharactor里。
class FightCharactor extends Monobehaviour {

        // 实现掉血,加血,血条的机制;

        private float hp; // 战斗单元的血量

        private UICharactor uiCharactor; // 控制ui血条显示,角色昵称显示的组件实例;

        // end



        public void Init() {} //

}



Class Player extends FightCharactor {

        // 实现玩家特有的策略

        // end

}



Class BossEnemy extends FightCharactor {

        // 实现Boss特有的策略

        // end

}接下来设计一个UICharactor组件类,new 一个组件类的实例添加到血条与昵称的ui对象上,来提供显示血条进度,与显示角色昵称的功能。

class UICharactor extends MonoBehaviour {

        public void SetBloodPer(float per) {…}

        public void SetUnick(string unick) {…}

}
在主战斗UI界面控制代码处提供一个接口UICharactor CreateUICharactor(),返回UIChractor对象实例。伪代码如下:
UICharactor CreateUICharactor() {

        GameObject uiObject = GameObject. Instantiate(UI血条+昵称的预制体);

        // 将血条对象放到UIBloodRoot节点下;

        uiObject.transform.SetParent(this.UIBloodRoot, false);



        UICharactor ctrl = uiObject.AddComponent<UICharactor>(); //添加组件实例到UI节点

        return ctrl;



}在战斗角色FightCharactor类中的初始化方法Init中,调用UI控制代码的CreateUICharactor接口,获得UICharactor的组件实例,这样就可以在战斗掉血中,调用UICharactor的接口来显示血量与昵称了。
public void Init() {

        this.uiCharactor = 游戏UI界面控制对象实例. CreateUICharactor();

}在代码中this.uiCharactor. SetBloodPer接口可以显示角色的血量,this.uiCharactor.SetUnick接口可以显示玩家的昵称等。


class FightCharactor {

        // …

        void LateUpdate() {

                Vector3 worldPos = this.mountPoint.transform.position;

                Vector3 sceenPos = this.gameCamera.WorldToSceen(worldPos);

                this.uiCharactor.ShowAt(sceenPos);

        }

        // …

}



class UICharactor {

        // …

        public void ShowAt(Vector3 sceenPos) {

                Vector3 wordPos = ui模式下屏幕坐标转世界坐标;

                this.transform.position = worldPos;

        }

        // …

}本期的战斗系统的UI血条昵称的架构与设计就分析到这里,我录制了了一个视频课件,完整的讲解与实现了刚才的架构与设计,进入小组可以领取。
页: [1]
查看完整版本: Unity战斗单元UI血条架构设计