Modèle de contrôleur de vue de modèle (MVC) dans Unity (2024)

Mieux connu sous le nom de Model View Presenter (MVP) dans Unity

Modèle de contrôleur de vue de modèle (MVC) dans Unity (1)

Publié dans

Génie du développeur

·

9 minutes de lecture

·

5 mai 2022

--

J'ai une belle interface utilisateur pour afficher ma santé, mon XP et mon niveau à partir de monArticle sur le modèle d'observateur, leModèle MVCen dépend fortement.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (3)

Maintenant, je dois intégrer mon interface utilisateur dans mon projet. On pourrait être tenté de dire hé, j'ai le niveau qui contrôle tout ce qui concerne la mise à niveau et la santé qui contrôle la santé, il suffit d'y mettre le code de l'interface utilisateur. C'est logique. Cela se fait un peu dans les exemples qui démontrent un concept pour faciliter l'affichage de ce concept ou dans les prototypes. Le faire de cette façon rompt la modularité de votre code et fait maintenant en sorte que le code fasse plus d'une chose. Il est maintenant responsable de ce qu'il est censé faire et de la mise à jour de l'interface utilisateur. Une meilleure approche consiste à utiliser leModèle de contrôleur de vue de modèle (MVC). Dans Unity, le concept réel utilisé est connu sous le nom de Model View Presenter (MVP) qui est basé sur le contrôleur de vue de modèle traditionnel (MVC).

Modèle de contrôleur de vue de modèle (MVC) dans Unity (4)

Voyons comment je peux implémenter cela dans Unity.

Tout le code nécessaire pour prendre en charge ce concept sera dans des blocs de code. Si le code est une image ou un gif, il s'agit d'un code qui n'est pas nécessaire pour prendre en charge le concept.

public float CurrentHealth { obtenir ; ensemble; }//prend en charge le concept
Modèle de contrôleur de vue de modèle (MVC) dans Unity (5)

Unity s'occupe déjà de la partie vue pour moi. Sous la forme du canevas et de tous les éléments que vous pouvez utiliser sur un canevas (par exemple, bouton, texte, curseur d'image, etc.). Unity contrôle la potion de rendu et plusieurs des éléments ont des événements (c'est-à-dire un bouton, un curseur, etc.)

Modèle de contrôleur de vue de modèle (MVC) dans Unity (6)

J'ai déjà le modèle (Game Logic) terminé afin d'utiliser le MVP, je devrai ajouter les événements On Change.

Cela me laisse avec le présentateur. Celui-ci sera chargé de recevoir tous les événements d'entrée de la vue et de mettre à jour les variables utilisées dans la vue.

MVP de la santé

Voir— Dans ma conception, j'affiche la santé sous forme de barre. La barre se remplit à mesure qu'il y a plus de santé et diminue à mesure que la santé diminue. Je pourrais créer ma propre barre pour ce faire, mais je tirerai parti du curseur intégré de Unity pour cela. Je me suis assuré que le curseur n'est pas intraitable (je ne veux pas que le joueur modifie sa santé avec le curseur). Afin de modifier la santé du joueur, je modifie la valeur du curseur.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (7)

Modèle- Actuellement, ma santé a une santé complète, une santé actuelle, un moyen de reposer la santé, draine la santé au fil du temps et observe le niveau de l'événement de niveau supérieur.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (8)

Le présentateur devra connaître la valeur actuelle de la santé, quelle est la santé maximale et quand ces valeurs changent.

La première chose que je ferai est de créer l'événement lorsque la santé changera. J'utilise une action qui prend pour flotter des valeurs une pour la santé actuelle et une pour la santé maximale.

// 
/// Chaque fois que la santé change, les observateurs savent quelle est la santé actuelle et quelle est la santé maximale.
///

public Action onHealthChanged ;

Ensuite, je crée une méthode qui invoquera cet événement. J'utiliserai cette méthode chaque fois que les valeurs de santé changeront.

vide privé OnHealthChanged()
{
si (onHealthChanged != null)
onHealthChanged.Invoke(CurrentHealth, m_fullHealth);
}

J'ai déjà une propriété pour la santé actuelle et c'est ce que j'utilise pour définir la valeur de la santé actuelle. Je vais modifier cela pour utiliser un champ de sauvegarde. La partie importante ici est d'avoir la propriété ayant l'événement On Change appelé lorsque la santé actuelle change.

Changer cette lignepublic float CurrentHealth { obtenir ; ensemble privé; }pour

flotteur privé m_currentHealth ;flotteur public CurrentHealth
{
obtenir => m_currentHealth ;
ensemble
{
m_currentHealth ;
OnHealthChanged();
}
}

J'ai décidé de fixer également la santé actuelle entre 0 et la pleine santé si la santé actuelle est inférieure ou égale à la pleine santé. Sinon, il s'assure que la santé ne descend pas en dessous de 0.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (9)

Maintenant, j'ai besoin d'une propriété pour Max Health. La partie importante ici est d'avoir la propriété ayant l'événement On Change appelé lorsque Max Health change.

flotteur public MaxHealth
{
obtenir => m_fullHealth ;
ensemble
{
m_fullHealth = valeur ;
OnHealthChanged();
}
}

Lors de la définition de cette valeur, je modifie également la quantité de santé actuelle du personnage afin qu'elle augmente du même montant que la santé complète. Je le fixe également à la valeur la plus élevée entre la nouvelle valeur calculée et la santé actuelle, cela m'empêche de soustraire la santé du joueur, cela lui donne un boost de santé temporaire qui ne durera que tant qu'il ne subira pas de dégâts.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (10)

Présentateur— Maintenant, tout ce dont j'ai besoin, c'est du présentateur de santé. Cela prend en charge le traitement des événements d'entrée à partir de la vue dans le cas de ce projet, il n'y en a pas. Et il doit mettre à jour les valeurs de la vue en prenant soin de tout formatage lorsque le modèle envoie l'événement On Change.

Je commence par créer un nouveau MonoBehavior appelé Heath Presenter

classe publiquePrésentateur Santé: MonoComportement
{

}

Le présentateur doit savoir pour quelle santé il s'agit d'un présentateur.

[SerializeField] santé privée m_health ;

Donc, je n'oublie pas de les définir, je vais le faire maintenant dans Unity. J'ajoute un présentateur de santé à l'interface utilisateur de santé sur mon canevas.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (11)

Je m'assure également que le présentateur a un ensemble de santé, c'est juste pour que je n'obtienne pas d'erreurs plus tard.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (12)

Maintenant, je dois observer la santé pour son événement de changement. Il est recommandé de s'inscrire aux événements dans On Enable et de se désinscrire dans On Disable.

vide privéActiver()
{
m_health.onHealthChanged += OnHealthChanged ;
}

vide privéOnDisable()
{
m_health.onHealthChanged -= OnHealthChanged ;
}

vide privé OnHealthChanged(float currentHealth, float maxHealth)
{
// Mettre à jour la vue.
}

Maintenant, tout ce que j'ai à faire est de mettre à jour la vue. Étant donné que j'utilise un Slider pour afficher ma santé, je devrai obtenir une référence à celui-ci.

[SerializeField] Curseur privé m_healthSlider ;

N'oubliez pas l'instruction using pour l'interface utilisateur.

en utilisant UnityEngine.UI ;

Je m'assure également que le présentateur a un jeu de curseurs, c'est juste pour que je n'obtienne pas d'erreurs plus tard.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (13)

Je l'attribue également dans l'inspecteur maintenant pour ne pas oublier de le faire.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (14)

Maintenant, je dois mettre à jour la vue lorsque l'événement On Change se produit. Il y a 2 façons de le faire.

  1. Je peux définir la valeur maximale du curseur sur la santé maximale et définir la valeur du curseur sur la santé actuelle
  2. Ou je peux définir la valeur des curseurs sur Santé actuelle / Santé maximale.

Je vais choisir l'option 2.

vide privé OnHealthChanged(float currentHealth, float maxHealth)
{
m_healthSlider.value = currentHealth / maxHealth ;
}

Enfin, je veux m'assurer que la vue est mise à jour au démarrage du jeu.

vide privéCommencer()
{
OnHealthChanged(m_health.CurrentHealth, m_health.MaxHealth);
}

MVP de niveau

Voir— Dans ma conception, j'affiche l'XP de la même manière que j'affiche la Santé. J'ai aussi un bouton qui ajoute de l'expérience et du texte qui affiche le niveau actuel.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (15)

Modèle- Actuellement, mon niveau a des points par niveau, un niveau actuel, un événement d'unité de niveau supérieur et un événement de niveau supérieur et une méthode privée pour acquérir de l'expérience. Il exécute également une coroutine qui gagne de l'expérience dont je n'ai plus besoin puisque j'utiliserai l'interface utilisateur pour acquérir de l'expérience.

Comme je n'ai plus besoin de la Start Coroutine, je vais la supprimer.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (16)

Maintenant, je dois également rendre publique la méthode Gain Experience.

Changer cette lignevide privé GainExperience (int montantToGain)pour

public void GainExperience(int montantToGain)

J'ai besoin de savoir ce qu'est l'Expérience Max.

public int MaxExperiencePoints => m_pointsPerLevel * (CurrentLevel + 1);

Maintenant, j'ai besoin de savoir quand les points d'expérience ont changé.

action publique sur l'expérience modifiée ;

Je m'assure d'appeler ceci après avoir augmenté les points d'expérience dans Gain d'expérience.

public void GainExperience(int montantToGain)
{
int niveauprécédent = niveauactuel ;
ExperiencePoints += montantToGain ;
onExperienceChanged?.Invoke();// ajouté
if (CurrentLevel <= previousLevel) return ;

m_levelUpEvent?.Invoke();
OnLevelUp?.Invoke(CurrentLevel);
}

Le modèle peut maintenant être mis à jour par le présentateur et envoyer tous les événements de changement nécessaires.

Présentateur— Maintenant, tout ce dont j'ai besoin, c'est du présentateur de niveau. Cela prend en charge le traitement des événements d'entrée à partir de la vue dans le cas de ce projet lorsque le bouton est cliqué. Et il doit mettre à jour les valeurs de la vue en prenant soin de tout formatage lorsque le modèle envoie les événements On Change.

Je commence par créer un nouveau MonoBehavior Called Level Presenter

classe publiqueNiveauPrésentateur: MonoComportement
{

}

Le présentateur doit savoir pour quel niveau il est présentateur.

[SerializeField] niveau privé m_level ;

Donc, je n'oublie pas de les définir, je vais le faire maintenant dans Unity. J'ajoute un présentateur de niveau à l'interface utilisateur de niveau sur mon canevas.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (17)

Maintenant, mon présentateur doit connaître la vue (curseur, texte et bouton).

[SerializeField] Curseur privé m_xpSlider ;

[SerializeField] Texte privé m_levelText ;

[SerializeField] Bouton privé m_gainXPButton ;

Je les attribue dans l'inspecteur avant d'oublier.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (18)

Bien sûr, je m'assure que tous les objets de vue requis sont définis.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (19)

Maintenant, je dois m'inscrire correctement à l'événement Button On Click Unity en ajoutant un écouteur, en supprimant l'écouteur. Lorsque le bouton est cliqué, je dis au niveau de gagner de l'expérience.

vide privéActiver()
{
m_gainXPButton?.onClick.AddListener(OnGainExperienceClicked);
}

vide privéOnDisable()
{
m_gainXPButton?.onClick.RemoveListener(OnGainExperienceClicked);
}

vide privé OnGainExperienceClicked()
{
m_level.GainExperience(10);
}

Je dois m'inscrire correctement à l'action Level On Level Up Even et On Experienced Changed.

vide privéActiver()
{
m_gainXPButton?.onClick.AddListener(OnGainExperienceClicked);

m_level.onExperienceChanged += OnExperienceChanged ;
m_level.OnLevelUp += OnLevelUp ;
}

vide privéOnDisable()
{
m_gainXPButton?.onClick.RemoveListener(OnGainExperienceClicked);

m_level.onExperienceChanged -= OnExperienceChanged ;
m_level.OnLevelUp -= OnLevelUp ;
}

vide privé OnExperienceChanged() { }

vide privé OnLevelUp (int niveau actuel) { }

Maintenant, je dois mettre à jour la vue lorsque l'expérience change.

vide privé OnExperienceChanged()
{
m_xpSlider.value = (float)m_level.ExperiencePoints / m_level.MaxExperiencePoints ;
}

Ensuite, je mets à jour la vue lorsque le niveau change.

vide privé OnLevelUp (int niveau actuel)
{
m_levelText.text = $"{currentlevel}" ;
}

Enfin, je veux m'assurer que la vue est mise à jour lorsque le présentateur est activé.

vide privéActiver()
{
OnExperienceChanged();// ajouté
OnLevelUp(m_level.CurrentLevel);// ajouté

m_gainXPButton?.onClick.AddListener(OnGainExperienceClicked);

m_level.onExperienceChanged += OnExperienceChanged ;
m_level.OnLevelUp += OnLevelUp ;
}

Maintenant, je m'assure que tout fonctionne correctement dans Unity en mode lecture.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (20)

Juste un pas que lors des tests après avoir terminé le MVP de la santé, j'ai constaté que j'avais mon niveau de santé complet à l'envers.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (21)

Lors du test du niveau, j'ai réalisé que j'avais oublié de convertir ma formule XP en flottant lors du réglage de la valeur du curseur, ce qui l'a fait rester à 0 et la barre n'a pas augmenté lorsque j'ai ajouté XP.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (22)

Comme toujours, le code pour cela peut être trouvé sur mon hub Git.

Modèle de contrôleur de vue de modèle (MVC) dans Unity (2024)

FAQs

What is the MVC model for game development? ›

The Model-View-Controller pattern (MVC) splits the software into three major components: Models (Data CRUD), Views (Interface/Detection) and Controllers (Decision/Action). MVC is flexible enough to be implemented even on top of ECS or OOP.

How to implement MVC in Unity? ›

When developing a Unity project with MVC, the existing UI framework (either the UI Toolkit or Unity UI) naturally functions as the View. Because the engine gives you a complete user interface implementation, you won't need to develop individual UI components from scratch.

What is MVC in C#? ›

MVC stands for Model, View, and Controller. MVC separates an application into three components - Model, View, and Controller. Model: Model represents the shape of the data. A class in C# is used to describe a model. Model objects store data retrieved from the database.

What is MVC beginner? ›

The most popular of these patterns is MVC also known as Model View Controller. The Model-View-Controller (MVC) framework is an architectural/design pattern that separates an application into three main logical components Model, View, and Controller.

Is MVC good for game development? ›

MVC is flexible for implementing even the top ECS or OOP. The gaming and UI development will have the usual workflow of waiting for input. Only when they receive an input of any form they can decide upon the appropriate response, and update the data accordingly.

How to create a model in MVC application? ›

Creating a Model

To add the model, just right click on the Model folder of the project and then follow this sequence Model->Add->New Item->Visual C#->Code->Class. It contains some default code as given below.

What is design pattern in MVC? ›

MVC Pattern stands for Model-View-Controller Pattern. This pattern is used to separate application's concerns. Model - Model represents an object or JAVA POJO carrying data. It can also have logic to update controller if its data changes. View - View represents the visualization of the data that model contains.

Is MVC easy to learn? ›

It's hard to understand in the first place. While as soon as you understand it, there is no problem to learn. But understanding is a real problem given that for ages PHP folks were laboriously misinterpreting this simple pattern. Actually, the whole thing is about a model.

Is MVC a programming language? ›

MVC was originally conceptualized in 1976 as a development architecture for creating desktop applications. MVC has since evolved into a framework for creating cross-platform compatible applications using a variety of programming languages including Ruby on Rails, . NET, Java and many others.

Is MVC good or bad? ›

The MVC pattern is an excellent method for developing software applications. MVC frameworks are simple due to the numerous benefits, including organizing code and managing multiple views.

Why do we need to learn MVC? ›

MVC is a pattern for developing applications that are well architected, testable and easy to maintain. In this article you will learn how to add a controller. Download ASP.NET MVC and learn how to build web apps using the model view controller pattern.

What is the best explanation of MVC? ›

-MVC is an architectural pattern consisting of three parts: Model, View, Controller. Model: Handles data logic. View: It displays the information from the model to the user. Controller: It controls the data flow into a model object and updates the view whenever data changes.

When should I use MVC? ›

  1. We can use MVC when our screen has a One-Direction-Flow of actions, all interactions by the user do affect the Model, but it's result does not affect the UI.
  2. We can use MVC when our screen is simple enough (similar to the no architecture example), but it need to communicate with our Model layer ...
Feb 26, 2018

What is the model in the MVC design? ›

The model-view-controller (MVC) design pattern specifies that an application consist of a data model, presentation information, and control information. The pattern requires that each of these be separated into different objects.

What is an example of a MVC model? ›

Car driving mechanism is another example of the MVC model. Every car consist of three main parts. View= User interface : (Gear lever, panels, steering wheel, brake, etc.)

Which process model is best for game development? ›

The spiral model is for sure one of the best technique that you can use to develop games. There are others techniques that you can use, but the spiral is for sure the best choice if you are new to the game development.

What are the three models of MVC? ›

We've inherited from the original MVC pattern a rather simplistic idea of what should be in the Model. In fact, in ASP.NET MVC, there are three distinct types of model: the domain model, view model and input model.

References

Top Articles
Latest Posts
Article information

Author: Carmelo Roob

Last Updated:

Views: 6515

Rating: 4.4 / 5 (45 voted)

Reviews: 84% of readers found this page helpful

Author information

Name: Carmelo Roob

Birthday: 1995-01-09

Address: Apt. 915 481 Sipes Cliff, New Gonzalobury, CO 80176

Phone: +6773780339780

Job: Sales Executive

Hobby: Gaming, Jogging, Rugby, Video gaming, Handball, Ice skating, Web surfing

Introduction: My name is Carmelo Roob, I am a modern, handsome, delightful, comfortable, attractive, vast, good person who loves writing and wants to share my knowledge and understanding with you.