mirror of
https://github.com/godotengine/godot-docs.git
synced 2026-01-05 22:09:56 +03:00
Added C# code examples for Using signals page. (#6010)
* Added C# code examples for using signals page. Also changed a bit one GDscript example.
This commit is contained in:
@@ -84,7 +84,7 @@ Your scene tree and viewport should look like this.
|
||||
|
||||
.. image:: img/signals_09_scene_setup.png
|
||||
|
||||
Save your newly created scene. You can then run it with :kbd:`F6`.
|
||||
Save your newly created scene. You can then run it with :kbd:`F6` (:kbd:`Cmd + R` on macOS).
|
||||
At the moment, the button will be visible, but nothing will happen if you
|
||||
press it.
|
||||
|
||||
@@ -153,6 +153,13 @@ the ``not`` keyword to invert the value.
|
||||
func _on_Button_pressed():
|
||||
set_process(not is_processing())
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
public void OnButtonPressed()
|
||||
{
|
||||
SetProcess(!IsProcessing());
|
||||
}
|
||||
|
||||
This function will toggle processing and, in turn, the icon's motion on and off
|
||||
upon pressing the button.
|
||||
|
||||
@@ -168,6 +175,15 @@ following code, which we saw two lessons ago:
|
||||
var velocity = Vector2.UP.rotated(rotation) * speed
|
||||
position += velocity * delta
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
public override void _Process(float delta)
|
||||
{
|
||||
Rotation += AngularSpeed * delta;
|
||||
var velocity = Vector2.Up.Rotated(Rotation) * Speed;
|
||||
Position += velocity * delta;
|
||||
}
|
||||
|
||||
Your complete ``Sprite2D.gd`` code should look like the following.
|
||||
|
||||
.. tabs::
|
||||
@@ -188,6 +204,28 @@ Your complete ``Sprite2D.gd`` code should look like the following.
|
||||
func _on_Button_pressed():
|
||||
set_process(not is_processing())
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
using Godot;
|
||||
|
||||
public class Sprite : Godot.Sprite2D
|
||||
{
|
||||
private float Speed = 400;
|
||||
private float AngularSpeed = Mathf.Pi;
|
||||
|
||||
public override void _Process(float delta)
|
||||
{
|
||||
Rotation += AngularSpeed * delta;
|
||||
var velocity = Vector2.Up.Rotated(Rotation) * Speed;
|
||||
Position += velocity * delta;
|
||||
}
|
||||
|
||||
public void OnButtonPressed()
|
||||
{
|
||||
SetProcess(!IsProcessing());
|
||||
}
|
||||
}
|
||||
|
||||
Run the scene now and click the button to see the sprite start and stop.
|
||||
|
||||
Connecting a signal via code
|
||||
@@ -240,6 +278,13 @@ in a variable.
|
||||
func _ready():
|
||||
var timer = get_node("Timer")
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
var timer = GetNode<Timer>("Timer");
|
||||
}
|
||||
|
||||
The function ``get_node()`` looks at the Sprite2D's children and gets nodes by
|
||||
their name. For example, if you renamed the Timer node to "BlinkingTimer" in the
|
||||
editor, you would have to change the call to ``get_node("BlinkingTimer")``.
|
||||
@@ -255,6 +300,14 @@ We can now connect the Timer to the Sprite2D in the ``_ready()`` function.
|
||||
var timer = get_node("Timer")
|
||||
timer.timeout.connect(_on_Timer_timeout)
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
var timer = GetNode<Timer>("Timer");
|
||||
timer.Connect("timeout", this, nameof(OnTimerTimeout));
|
||||
}
|
||||
|
||||
The line reads like so: we connect the Timer's "timeout" signal to the node to
|
||||
which the script is attached. When the Timer emits ``timeout``, we want to call
|
||||
the function ``_on_Timer_timeout()``, that we need to define. Let's add it at the
|
||||
@@ -266,6 +319,13 @@ bottom of our script and use it to toggle our sprite's visibility.
|
||||
func _on_Timer_timeout():
|
||||
visible = not visible
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
public void OnTimerTimeout()
|
||||
{
|
||||
Visible = !Visible;
|
||||
}
|
||||
|
||||
The ``visible`` property is a boolean that controls the visibility of our node.
|
||||
The line ``visible = not visible`` toggles the value. If ``visible`` is
|
||||
``true``, it becomes ``false``, and vice-versa.
|
||||
@@ -306,6 +366,39 @@ Here is the complete ``Sprite2D.gd`` file for reference.
|
||||
func _on_Timer_timeout():
|
||||
visible = not visible
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
using Godot;
|
||||
|
||||
public class Sprite : Godot.Sprite2D
|
||||
{
|
||||
private float Speed = 400;
|
||||
private float AngularSpeed = Mathf.Pi;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
var timer = GetNode<Timer>("Timer");
|
||||
timer.Connect("timeout", this, nameof(OnTimerTimeout));
|
||||
}
|
||||
|
||||
public override void _Process(float delta)
|
||||
{
|
||||
Rotation += AngularSpeed * delta;
|
||||
var velocity = Vector2.Up.Rotated(Rotation) * Speed;
|
||||
Position += velocity * delta;
|
||||
}
|
||||
|
||||
public void OnButtonPressed()
|
||||
{
|
||||
SetProcess(!IsProcessing());
|
||||
}
|
||||
|
||||
public void OnTimerTimeout()
|
||||
{
|
||||
Visible = !Visible;
|
||||
}
|
||||
}
|
||||
|
||||
Custom signals
|
||||
--------------
|
||||
|
||||
@@ -326,6 +419,18 @@ reaches 0.
|
||||
|
||||
var health = 10
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
using Godot;
|
||||
|
||||
public class CustomSignal : Node2D
|
||||
{
|
||||
[Signal]
|
||||
public delegate void HealthDepleted();
|
||||
|
||||
private int Health = 10;
|
||||
}
|
||||
|
||||
.. note:: As signals represent events that just occurred, we generally use an
|
||||
action verb in the past tense in their names.
|
||||
|
||||
@@ -344,6 +449,18 @@ To emit a signal in your scripts, call ``emit_signal()``.
|
||||
if health <= 0:
|
||||
emit_signal("health_depleted")
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
public void TakeDamage(int amount)
|
||||
{
|
||||
Health -= amount;
|
||||
|
||||
if (Health < 0)
|
||||
{
|
||||
EmitSignal(nameof(HealthDepleted));
|
||||
}
|
||||
}
|
||||
|
||||
A signal can optionally declare one or more arguments. Specify the argument
|
||||
names between parentheses:
|
||||
|
||||
@@ -354,6 +471,20 @@ names between parentheses:
|
||||
|
||||
signal health_changed(old_value, new_value)
|
||||
|
||||
var health = 10
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
using Godot;
|
||||
|
||||
public class CustomSignal : Node
|
||||
{
|
||||
[Signal]
|
||||
public delegate void HealthChanged(int oldValue, int newValue);
|
||||
|
||||
private int Health = 10;
|
||||
}
|
||||
|
||||
.. note::
|
||||
|
||||
The signal arguments show up in the editor's node dock, and Godot can use
|
||||
@@ -372,6 +503,15 @@ To emit values along with the signal, add them as extra arguments to the
|
||||
health -= amount
|
||||
emit_signal("health_changed", old_health, health)
|
||||
|
||||
.. code-tab:: csharp C#
|
||||
|
||||
public void TakeDamage(int amount)
|
||||
{
|
||||
var oldHealth = Health;
|
||||
Health -= amount;
|
||||
EmitSignal(nameof(HealthChanged), oldHealth, Health);
|
||||
}
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user