Lors des entretiens, on me demande souvent comment concevoir un système point rouge. Cet article présentera en détail comment concevoir un système point rouge, ses interfaces et donnera une implémentation complète.
Analyse des besoins du système Red Dot
Tout d'abord, analysons les exigences de conception du système point rouge : à proprement parler, le système point rouge n'appartient pas au framework, mais à la logique du jeu, le code ne doit donc pas être placé dans un cadre général, car il n'appartient pas au service de base. Il est destiné à être un bon rappel des informations non traitées dans le développement de la logique du jeu. Pour les utilisateurs, ils espèrent que le système de points rouges pourra leur fournir directement des interfaces et des services, et pourra facilement afficher des points rouges sous des nœuds spécifiques et les placer à des emplacements spécifiques. Les utilisateurs n'ont pas besoin de se soucier de « l'apparence » des points rouges, de la façon de créer des points rouges, des performances de création et de destruction répétées de points rouges, etc.
droite! Il existe ici un groupe d'échange sur le développement de jeux , qui rassemble un groupe de novices qui aiment apprendre les jeux, ainsi que des experts techniques engagés dans le développement de jeux. Vous êtes invités à venir échanger et apprendre.
De l'analyse de la demande, il est conclu que les interfaces externes fournies par le « Red Dot System » sont les suivantes :
1 : Écrivez l'interface "CreateRedPoint" pour créer un nœud "point rouge" et renvoyer le nœud à l'utilisateur. L'utilisateur décide où placer le point rouge ;
2 : Ecrire l'interface "DestroyRedPoint" pour supprimer et détruire un nœud point rouge ;
3 : Écrivez l'interface « SetRedPointValue », passez le nœud du point rouge, puis définissez la valeur spécifique dans le point rouge ;
4 : Écrivez l'interface « DestroyAllRedPoints », qui est utilisée pour supprimer et recycler tous les points rouges sous l'interface UI lorsqu'elle est détruite ;
Étant donné que le « système Red Dot » crée et supprime fréquemment des nœuds, il adopte le mode pool de nœuds en interne, ce qui peut maximiser les performances.
Services de base sur lesquels s'appuie le système Red Dot
Le système Red Dot n'est pas complètement indépendant et s'appuie sur les services de base du framework.L'un est la gestion des ressources, qui est principalement responsable du chargement des ressources du nœud Red Dot, et l'autre est le module de gestion du pool de nœuds. L'exemple de code du module de gestion des ressources utilise YooAssets, puis les nœuds points rouges sont transformés en préfabriqués, puis collectés et empaquetés via YooAssets, puis les ressources du nœud sont chargées via le code. Le système de point rouge est basé en interne sur le mécanisme de pool de nœuds, donc un pool de nœuds unique doit être créé pour le nœud de point rouge.
Version de YooAssets : 1.5.2
Gestion des ressources ResMgr : gestion des ressources synchrones/asynchrones basée sur YooAssets
Pool de nœuds : implémentez-le vous-même, consultez le code pour plus de détails ;
Préfabriqué de nœud de point rouge : il y a deux nœuds enfants sous le nœud RedPoint, un elfe circulaire rouge et une étiquette de texte, utilisés pour afficher les nombres, comme le montre la figure suivante :
Implémentation spécifique du code système Red Dot
Ecrivez un composant RedPointFlag,hérité de Component,pour marquer quels nœuds sont des points rouges.La fonction de ce composant est d'utiliser ce composant Flag pour trouver tous les "points rouges" lorsqu'une interface UI est détruite, et de les recycler ensemble.
classe publique RedPointFlag : composant
{
}
Écrivez un singleton global de RedPointMgr pour fournir le service « point rouge ». Fournit l'interface Init. Pendant Init, un pool de nœuds est créé pour le point rouge. le code s'affiche comme ci-dessous :
classe publique RedPointMgr : UnitySingleton<RedPointMgr>
{
public void Init() {
NodePoolMgr.Instance.AddNodePool("GUI/Prefabs/RedPoint.prefab", 10);
}
}
Interface CreateRedPoint :
public GameObject CreateRedPoint() {
GameObject redPoint = NodePoolMgr.Instance.Get("GUI/Prefabs/RedPoint.prefab");
if (redPoint.GetComponent<RedPointFlag>() == null) {
redPoint.AddComponent<RedPointFlag>();
}
renvoyer RedPoint ;
}
Une attention particulière doit être portée à cette interface. Nous ajoutons une instance du composant RedPointFlag au nœud de point rouge pour faciliter la recherche ultérieure de tous les points rouges.
Interface SetRedPointValue :
public void SetRedPointValue (GameObject redPoint, valeur int) {
var label = redPoint.GetComponentInChildren<Text>();
label.text = value.ToString();
}
Il permet de définir la valeur d'affichage correspondante du point rouge. Le principe est relativement simple, il suffit de trouver le composant Texte dans le point rouge et de modifier le contenu d'affichage du composant Texte.
Interface DétruireRedPoint :
public void DestroyRedPoint (GameObject redPoint) {
NodePoolMgr.Instance.Recycle("GUI/Prefabs/RedPoint.prefab", redPoint);
}
Supprimez un point rouge. Il s'agit principalement d'appeler le recyclage du pool de nœuds.
Interface DétruireAllRedPoint :
public void DestroyAllRedPoint (GameObject uiRoot) {
RedPointFlag[] redPoints = uiRoot.GetComponentsInChildren<RedPointFlag>();
pour (int i = 0; i < redPoints.Length; i++) {
NodePoolMgr.Instance.Recycle("GUI/Prefabs/RedPoint.prefab", redPoints[i].gameObject);
}
}
Supprimez tous les points rouges. Ici, nous utilisons le composant RedPointFlag. En filtrant tous les nœuds avec ce composant, nous avons nos nœuds de points rouges. Ensuite, recyclez simplement tous les nœuds.
Ensuite, donnons un exemple d'utilisation simple. Il est très simple et pratique à utiliser. Créez un point rouge dans le code de l'interface utilisateur et supprimez tous les points rouges lorsque l'interface est détruite :
classe publique UIHomeCtrl : MonoBehaviour
{
// Start est appelé avant la première mise à jour du frame
vide Début()
{
Transformer root = this.transform.Find("Bottom/start/btnStart");
var redPoint = RedPointMgr.Instance.CreateRedPoint();
redPoint.transform.SetParent(root, false);
redPoint.transform.localPosition = new Vector3(120, 40, 0);
RedPointMgr.Instance.SetRedPointValue(redPoint, 20);
}
vide privé OnDestroy()
{
RedPointMgr.Instance.DestroyAllRedPoint(this.gameObject);
}
}
" C'est tout pour le partage d'aujourd'hui. Si vous avez besoin du code complet, vous pouvez nous suivre et obtenir le code complet. "