123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- .. _doc_c_sharp_features:
- Features
- ============
- This page provied an overview over the commonly used features of both C# and Godot
- and how they are used together.
- Type Conversion and Casting
- ---------------------------
- C# is a statically typed language. Therefore you can't do the following:
- .. code-block:: csharp
- var mySprite = GetNode("MySprite")
- mySprite.SetFrame(0)
- The method ``GetNode()`` returns a ``Node`` instance.
- You must explicitly convert it to the desired derived type, ``Sprite`` in this case.
- For this, you have various options in C#.
- **Casting and Type Checking**
- Throws ``InvalidCastException`` if the returned node cannot be casted to Sprite.
- You would use it instead of the ``as`` operator if you are pretty sure it won't fail.
- .. code-block:: csharp
- Sprite mySprite = (Sprite)GetNode("MySprite");
- mySprite.SetFrame(0);
- **Using the AS operator**
- The ``as`` operator returns null if the node cannot be casted to Sprite,
- and for this reason it cannot be used with value types.
- .. code-block:: csharp
- Sprite mySprite = GetNode("MySprite") as Sprite;
- // Only call SetFrame() is mySprite is not null
- mySprite?.SetFrame(0);;
- **Type checking using the IS operator**
- To check if the node can be casted to Sprite, you can use the ``is`` operator.
- The ``is`` operator returns false if the node cannot be casted to Sprite,
- otherwise it returns true.
- .. code-block:: csharp
- if (GetNode("MySprite") is Sprite)
- {
- // Yup, it's a sprite!
- }
- For more advanced type checking, you can look into `Pattern Matching <https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching>`_.
- Signals
- -------
- For a complete C# example, see the **Handling a signal** section in the step by step :ref:`doc_scripting` tutorial.
- You can use ``Connect("SomeSignal", someObject, "SomeMethod")`` to connect to signals.
- ``AddUserSignal("SignalName")`` is used to define custom signals.
- Emitting signals is done with ``EmitSignal("SignalName")``. Params can be given, like ``EmitSignal("SignalName", arg1, arg2, ...)``.
- **Custom signals**
- .. code-block:: csharp
- :emphasize-lines: 5, 10
- :linenos:
- public class ExampleScript : Node
- {
- public override void _Ready()
- {
- AddUserSignal("YourSignal");
- }
- public override void _Process(float delta)
- {
- EmitSignal("YourSignal");
- }
- }
- Above in line 5, ``AddUserSignal()`` is used to define the new custom signal ``YourSignal``.
- In line 10 ``EmitSignal()`` is used to emit that custom signal on every frame in ``_Process()``.
- Make sure that ``AddUserSignal()`` is always executed before any calls using that signal (``EmitSignal()`` and ``Connect()``).
- If you are using both ``AddUserSignal()`` and ``Connect()`` or ``EmitSignal()`` in ``_Ready()``, this is especially important as load order of your node may change,
- and thus the order in which your various ``_Ready()`` functions are called.
|