Simple système d'événements dans l'Unité
Je suis en train d'utiliser le système d'événements de l'Unité (C#), mais j'ai de la difficulté à la mettre en œuvre.
La plupart des exemples, une classe, qui permet de définir le gestionnaire d'; ensuite, vous écrivez dans la même classe, la fonction qui correspond à la signature du gestionnaire, et vous écrivez les événements comme statique
public class EventExample : MonoBehaviour
{
public delegate void ExampleEventHandler();
public static event ExampleEventHandler OneDayPassed;
public static void NextTurn()
{
//do stuff then send event
if (OneDayPassed != null)
OneDayPassed();
}
}
Puis dans une autre classe, vous vous abonnez à des événements, créer une fonction qui va réellement faire quelque chose
public class EntityWatcher: MonoBehaviour
{
void Start()
{
EventExample.OneDayPassed += this.PrepareNextDay;
}
public void PrepareNextDay()
{
//Do other stuff that happen after the day is done
}
}
Jusqu'à présent pas de problèmes, mais je ne suis pas sûr de savoir comment puis-je concevoir ce, de sorte que toute GameObject d'un type particulier, allez vous abonner à cet événement. Par exemple, si vous avez une catégorie de personnel de GO, qui travaille de 8 à 6, et vous instancier lors de l'exécution; dois-je m'inscrire dans la classe principale de cette catégorie, ou devrais-je créer un script que j'attache de l'Objet Jeu de la préfabrication, qui vous inscrire à l'événement?
L'objectif est que tous les membres du personnel qui doit faire 8 à 6 maj au centre de sport, à savoir lors de la "journée de l'événement" le feu, mais je ne veux pas de vous abonner chaque prefab que j'instancie.
À partir de ma compréhension, je dois joindre un script avec le besoin de code sur le prefab, mais je ne peux pas trouver un exemple pratique qui montrent si cela est en fait la façon de le faire.
UnityEvent
. Vous n'utilisez pas et réalisme ne peut pas utiliser le "old fashioned" les événements d'il y a dix ans.Donc, il est préférable de s'appuyer sur quelque chose utilisé uniquement dans l'Unité, Vs quelque chose qui fait partie de la langue elle-même?
Salut @newbiez. Oui, c'est absolument correct.
Vous devez comprendre que quand vous utilisez l'Unité, vous êtes à l'aide d'un distorsion extrême de la programmation classique. Il n'est pas un OO système, c'est de l'ECS. Considérer cette récente question de moi-même, stackoverflow.com/questions/36251078/... l'unité a ces "interfaces" qui sont en réalité complètement détraqué et à l'opposé de "l'interface" en c#.
OriginalL'auteur | 2016-03-27
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
UnityEvent
.Il ne pouvait pas être plus facile. Faire un script BigScript.cs
Le mettre sur un objet de jeu. Maintenant de regarder dans l'Inspecteur. Génial, non?
Il suffit de glisser vos autres scripts pour y, pour faire quelque chose, quand "waouh" qui se passe.
C'est aussi simple que cela. Pour appeler l'événement dans BigScript, c'est juste
(si vous préférez,
if (whoa!=null) whoa.Invoke();
)Dans de rares cas, vous pouvez avoir besoin d'ajouter un écouteur via le code.
(Je veux dire, plutôt que de simplement en les faisant glisser dans l'Éditeur.)
Aujourd'hui, c'est simple. Être conscient de l'exemple de code sur internet.
Pour être clair: ne - faites simplement glisser pour se connecter. Je le mentionne seulement qu'il est complet.
C'est tout là est à lui.
Être conscient de code d'exemple à ce sujet sur internet.*
Ci-dessus montre comment connecter les fonctions simples qui n'ont pas d'argument.
Si vous avez besoin d'un argument:
Un exemple où la fonction a UN FLOTTEUR argument:
Simplement ajouter CE CODE au début du fichier:
alors vous êtes tous ensemble.
Lorsque vous faites glisser à partir de votre autre fonction à l'Éditeur de fente sur cette fonction:
Être absolument sûr d'utiliser ceux du haut - Dynamique "float".
Point de prêter à vos fonctions sera ÉGALEMENT répertorié dans le bas de la "Statique de la section" Paramètres de!
Qui est un énorme gotchya dans l'Unité!
salut newbiez, classique c# d'événements de ne fonctionne pas dans l'Unité de contexte puisque c'est un système ECS. Pour cette raison, Unité créée le (remarquable) UnityEvent système. Concernant le fait que vous travaillez sur plusieurs systèmes - no big deal. Vous devez être expert à la fois. C'est la vie!
Je vois, je n'ai appliquer mon système en utilisant un code C# avec des Événements et des Délégués, mais c'est beaucoup plus facile, et comform à l'ECS modèle, comme tout le reste dans l'Unité. En effet, vous devez être un jack de tous les échanges 🙂
Question: Ce que je voudrais comprendre, c'est comment spécifier les valeurs pour les arguments à l'Inspecteur lors de l'utilisation d'un dérivé de
UnityEvent
type e.g,public class CustomEvent:UnityEvent<string,float>
). Lors de l'utilisation de cette visite, l'Inspecteur comprendre la signature (string,float), permet la sélection de la fonction à appeler à l'intérieur de la cible de script, mais ne vous permet pas de spécifier les valeurs de ces arguments dans l'Inspecteur. Cette capacité est disponible lors de la liaison d'un stockUnityEvent
à une fonction qui prend unstring
argument. Peut-être qu'il n'est pas possible sans la coutume de la modification de code?en effet, je pense que, très simplement, "ils ne le faisons pas". Comme vous le dites, il ne fonctionne que dans la simple "une chaîne". Je suis trop paresseux pour ouvrir l'Unité sur le week-end, mais peut-être quelque chose comme ceci permet de ?? answers.unity.com/answers/1230225/view.html cheers!
OriginalL'auteur Fattie
Ne vous inquiétez pas trop sur le nombre d'abonnés si vous ne parlons que quelques dizaines. Oui, une fois que vous obtenez dans les centaines ou les milliers qu'il pourrait être une bonne idée pour optimiser cela, mais même alors. Première règle d'optimisation: ne pas optimiser.
Donc: chaque instance de s'abonner à l'événement et être fait avec elle.
OriginalL'auteur Thomas Hilbert