/* Yarn Spinner is licensed to you under the terms found in the file LICENSE.md. */ using System; using System.Collections; using UnityEngine; #nullable enable namespace Yarn.Unity { #region Class/Interface /// /// An attribute that marks a method on an object as a command. /// /// /// /// When a receives a , /// and no command handler has been installed for the command, it splits it /// by spaces, and then checks to see if the second word, if any, is the /// name of an object. /// /// /// By default, it checks for any s in the scene. If /// one is found, it is checked to see if any of the s attached to the class has a whose matches the first word of the command. /// /// If the method is static, it will not try to use an object. /// If a method is found, its parameters are checked: /// /// /// If the method takes a single [] parameter, the /// method is called, and will be passed an array containing all words in /// the command after the first two. /// /// /// If the method takes a number of parameters equal to the number of words /// in the command after the first two, it will be called with those words /// as parameters. /// /// /// If a parameter is a , we look up the object /// using . As per the API, the game /// object must be active. /// /// /// If a parameter is assignable to , we will locate /// the component based on the name of the object. As per the API of , the game object must be active. /// /// /// If a parameter is a , the string must be true /// or false (as defined by the standard converter for to ). However, we also allow for the /// string to equal the parameter name, case insensitive. This allows us to /// write commands with more self-documenting parameters, eg for a certain /// Move(bool wait), you could write <<move wait>> /// instead of <<move true>>. /// /// /// For any other type, we will attempt to convert using using the /// culture. /// This means that you can implement to add new /// accepted types. (Do be aware that it's a non-CLS compliant interface, /// according to its docs. Mono for Unity seems to implement it, but you may /// have trouble if you use any other CLS implementation.) /// /// Otherwise, it will not be called, and a warning will be /// issued. /// /// This attribute may be attached to a coroutine or to an async /// method. /// /// The determines if the method is a coroutine /// if the method returns , or if the method /// returns a or a task. /// /// /// If the method is a coroutine, returns a , or /// returns a task, the DialogueRunner will pause execution until the the /// coroutine or task ends. /// /// public class YarnCommandAttribute : YarnActionAttribute { /// public YarnCommandAttribute(string? name = null) => Name = name; } #endregion }