Enemy blinking

This commit is contained in:
Marco 2025-06-26 14:03:36 +02:00
commit e5a60a6ccd
11 changed files with 172 additions and 30 deletions

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=25 format=3 uid="uid://bh3vxmqflijgj"] [gd_scene load_steps=32 format=3 uid="uid://bh3vxmqflijgj"]
[ext_resource type="Script" uid="uid://dwregubt4iila" path="res://Scripts/Components/FSM/Enemy/3D/EnemyProxy3D.cs" id="1_a3crc"] [ext_resource type="Script" uid="uid://dwregubt4iila" path="res://Scripts/Components/FSM/Enemy/3D/EnemyProxy3D.cs" id="1_a3crc"]
[ext_resource type="Resource" uid="uid://ccym6mcq4fbul" path="res://Resources/Enemies/Fairy_Guard_3D.tres" id="2_jgarc"] [ext_resource type="Resource" uid="uid://ccym6mcq4fbul" path="res://Resources/Enemies/Fairy_Guard_3D.tres" id="2_jgarc"]
@ -9,7 +9,12 @@
[ext_resource type="Script" uid="uid://crahxykgis2bp" path="res://Scripts/Components/FSM/Enemy/3D/Shooting.cs" id="7_rg1hb"] [ext_resource type="Script" uid="uid://crahxykgis2bp" path="res://Scripts/Components/FSM/Enemy/3D/Shooting.cs" id="7_rg1hb"]
[ext_resource type="Script" uid="uid://3irm5sccr2fc" path="res://Scripts/Components/FSM/Enemy/3D/Dead.cs" id="8_5j04l"] [ext_resource type="Script" uid="uid://3irm5sccr2fc" path="res://Scripts/Components/FSM/Enemy/3D/Dead.cs" id="8_5j04l"]
[ext_resource type="Script" uid="uid://mpws3eyrmx0q" path="res://Scripts/Components/FSM/Enemy/3D/Controlled.cs" id="9_dm2sd"] [ext_resource type="Script" uid="uid://mpws3eyrmx0q" path="res://Scripts/Components/FSM/Enemy/3D/Controlled.cs" id="9_dm2sd"]
[ext_resource type="Shader" uid="uid://b8up3g1w7uqey" path="res://Shaders/Blink_3D.gdshader" id="10_2xi0r"]
[ext_resource type="Script" uid="uid://cq1joxgoj3jdp" path="res://Scripts/Components/Actors/3D/PlayerAnimationProvider3D.cs" id="10_5gcuf"]
[ext_resource type="Material" uid="uid://dsrsfpcpwmaql" path="res://Resources/Materials/Player_Blink_Teleport_Material_3D.tres" id="10_05pdu"]
[ext_resource type="Script" uid="uid://ts64slgd7twt" path="res://Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs" id="10_d6h7c"]
[ext_resource type="SpriteFrames" uid="uid://ch2ll1on8im2p" path="res://Resources/Sprites/FairyGuard.tres" id="10_hew1j"] [ext_resource type="SpriteFrames" uid="uid://ch2ll1on8im2p" path="res://Resources/Sprites/FairyGuard.tres" id="10_hew1j"]
[ext_resource type="Texture2D" uid="uid://xhwfgbv0fjbr" path="res://Sprites/Actors/FairyGuard.png" id="11_2xi0r"]
[ext_resource type="Script" uid="uid://de31afbiua8xu" path="res://Scripts/Components/FSM/Enemy/3D/EnemyFSMAnimatedSprite3D.cs" id="11_jgarc"] [ext_resource type="Script" uid="uid://de31afbiua8xu" path="res://Scripts/Components/FSM/Enemy/3D/EnemyFSMAnimatedSprite3D.cs" id="11_jgarc"]
[ext_resource type="Script" uid="uid://chq5a73kw0c0m" path="res://Scripts/Components/FSM/Enemy/3D/EnemyStorage3D.cs" id="11_xne4s"] [ext_resource type="Script" uid="uid://chq5a73kw0c0m" path="res://Scripts/Components/FSM/Enemy/3D/EnemyStorage3D.cs" id="11_xne4s"]
[ext_resource type="Script" uid="uid://extjdng8nk6r" path="res://Scripts/Components/FSM/Enemy/3D/PlayerDetection3D.cs" id="13_rg1hb"] [ext_resource type="Script" uid="uid://extjdng8nk6r" path="res://Scripts/Components/FSM/Enemy/3D/PlayerDetection3D.cs" id="13_rg1hb"]
@ -24,6 +29,20 @@
radius = 0.264547 radius = 0.264547
height = 0.935884 height = 0.935884
[sub_resource type="AtlasTexture" id="AtlasTexture_ad5n8"]
atlas = ExtResource("11_2xi0r")
region = Rect2(32, 0, 16, 16)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_d6h7c"]
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("10_2xi0r")
shader_parameter/tex = SubResource("AtlasTexture_ad5n8")
shader_parameter/blink_color = Color(0.954799, 0.00675169, 0, 1)
shader_parameter/blink_intensity = 0.0
shader_parameter/teleport_progress = 0.0
shader_parameter/scanline_density = 0.0
[sub_resource type="CylinderShape3D" id="CylinderShape3D_5j04l"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_5j04l"]
height = 1.91858 height = 1.91858
radius = 3.04834 radius = 3.04834
@ -54,17 +73,18 @@ shape = SubResource("CapsuleShape3D_jgarc")
[node name="StateMachine" type="Node" parent="."] [node name="StateMachine" type="Node" parent="."]
script = ExtResource("2_xne4s") script = ExtResource("2_xne4s")
[node name="Init" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "DetectionProvider")] [node name="Init" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "DetectionProvider", "_moduleNodes")]
script = ExtResource("4_jgarc") script = ExtResource("4_jgarc")
Storage = NodePath("../../Storage") Storage = NodePath("../../Storage")
DetectionProvider = NodePath("../../PlayerDetectionProvider") DetectionProvider = NodePath("../../PlayerDetectionProvider")
_moduleNodes = [NodePath("../../AnimationModule")]
[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "_moduleNodes")] [node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "_moduleNodes")]
script = ExtResource("5_rg1hb") script = ExtResource("5_rg1hb")
Storage = NodePath("../../Storage") Storage = NodePath("../../Storage")
PlayerDetection = NodePath("../../PlayerDetectionProvider") PlayerDetection = NodePath("../../PlayerDetectionProvider")
DebugEnabled = true DebugEnabled = true
_moduleNodes = [NodePath("../../DamageModule")] _moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")]
[node name="Alert" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "NavigationModule", "_moduleNodes")] [node name="Alert" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "NavigationModule", "_moduleNodes")]
script = ExtResource("6_jgarc") script = ExtResource("6_jgarc")
@ -72,7 +92,7 @@ Storage = NodePath("../../Storage")
PlayerDetection = NodePath("../../PlayerDetectionProvider") PlayerDetection = NodePath("../../PlayerDetectionProvider")
NavigationModule = NodePath("../../NavigationProvider") NavigationModule = NodePath("../../NavigationProvider")
DebugEnabled = true DebugEnabled = true
_moduleNodes = [NodePath("../../DamageModule")] _moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")]
[node name="Shooting" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "EquippedWeapon", "NavigationModule", "_moduleNodes")] [node name="Shooting" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "EquippedWeapon", "NavigationModule", "_moduleNodes")]
script = ExtResource("7_rg1hb") script = ExtResource("7_rg1hb")
@ -80,7 +100,7 @@ Storage = NodePath("../../Storage")
PlayerDetection = NodePath("../../PlayerDetectionProvider") PlayerDetection = NodePath("../../PlayerDetectionProvider")
EquippedWeapon = NodePath("../../Weapon") EquippedWeapon = NodePath("../../Weapon")
NavigationModule = NodePath("../../NavigationProvider") NavigationModule = NodePath("../../NavigationProvider")
_moduleNodes = [NodePath("../../DamageModule")] _moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")]
[node name="Dead" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage")] [node name="Dead" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage")]
script = ExtResource("8_5j04l") script = ExtResource("8_5j04l")
@ -91,14 +111,32 @@ script = ExtResource("9_dm2sd")
Storage = NodePath("../../Storage") Storage = NodePath("../../Storage")
_moduleNodes = [NodePath("../../DamageModule")] _moduleNodes = [NodePath("../../DamageModule")]
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="." node_paths=PackedStringArray("EnemyProxy")] [node name="AnimationModule" type="Node" parent="." node_paths=PackedStringArray("AnimationProvider", "Storage", "HealthProvider")]
script = ExtResource("10_d6h7c")
AnimationProvider = NodePath("../AnimationProvider")
Storage = NodePath("../Storage")
HealthProvider = NodePath("../DamageReceiver/HealthProvider")
[node name="AnimationProvider" type="Node3D" parent="." node_paths=PackedStringArray("AnimatedSprite")]
script = ExtResource("10_5gcuf")
AnimatedSprite = NodePath("../AnimatedSprite3D")
WalkRightAnimationName = &"right"
WalkLeftAnimationName = &"left"
WalkDownAnimationName = &"down"
WalkUpAnimationName = &"up"
BlinkMaterial = ExtResource("10_05pdu")
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="."]
transform = Transform3D(0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 0, 0, 0)
material_override = SubResource("ShaderMaterial_d6h7c")
pixel_size = 0.05 pixel_size = 0.05
billboard = 1 billboard = 1
texture_filter = 0 texture_filter = 0
sprite_frames = ExtResource("10_hew1j") sprite_frames = ExtResource("10_hew1j")
animation = &"down" animation = &"down"
frame = 2
frame_progress = 0.92087
script = ExtResource("11_jgarc") script = ExtResource("11_jgarc")
EnemyProxy = NodePath("..")
[node name="Storage" type="Node" parent="." node_paths=PackedStringArray("Root")] [node name="Storage" type="Node" parent="." node_paths=PackedStringArray("Root")]
script = ExtResource("11_xne4s") script = ExtResource("11_xne4s")
@ -125,10 +163,11 @@ debug_enabled = true
[node name="Weapon" parent="." instance=ExtResource("15_27vgy")] [node name="Weapon" parent="." instance=ExtResource("15_27vgy")]
[node name="DamageModule" type="Node" parent="." node_paths=PackedStringArray("DamageReceiver", "StorageModule")] [node name="DamageModule" type="Node" parent="." node_paths=PackedStringArray("DamageReceiver", "StorageModule", "AnimationProvider")]
script = ExtResource("16_27vgy") script = ExtResource("16_27vgy")
DamageReceiver = NodePath("../DamageReceiver") DamageReceiver = NodePath("../DamageReceiver")
StorageModule = NodePath("../Storage") StorageModule = NodePath("../Storage")
AnimationProvider = NodePath("../AnimationProvider")
[node name="DamageReceiver" type="Area3D" parent="." node_paths=PackedStringArray("HealthProvider")] [node name="DamageReceiver" type="Area3D" parent="." node_paths=PackedStringArray("HealthProvider")]
collision_layer = 64 collision_layer = 64

View file

@ -147,7 +147,7 @@ script = ExtResource("2_3oyrx")
[node name="Active" type="Node" parent="StateMachine" node_paths=PackedStringArray("_inputProvider", "AnimationProvider", "Storage", "DamageReceiver", "_moduleNodes")] [node name="Active" type="Node" parent="StateMachine" node_paths=PackedStringArray("_inputProvider", "AnimationProvider", "Storage", "DamageReceiver", "_moduleNodes")]
script = ExtResource("3_cc7e7") script = ExtResource("3_cc7e7")
_inputProvider = NodePath("../../InputProvider") _inputProvider = NodePath("../../InputProvider")
AnimationProvider = NodePath("../../Sprites") AnimationProvider = NodePath("../../AnimationProvider")
Storage = NodePath("../../Storage") Storage = NodePath("../../Storage")
DamageReceiver = NodePath("../../DamageReceiver") DamageReceiver = NodePath("../../DamageReceiver")
_moduleNodes = [NodePath("../../InputProvider"), NodePath("../../MovementModule"), NodePath("../../ShadowModule"), NodePath("../../InteractionController"), NodePath("../../ActivationProvider"), NodePath("../../WeaponModule"), NodePath("../../AcidDeathModule")] _moduleNodes = [NodePath("../../InputProvider"), NodePath("../../MovementModule"), NodePath("../../ShadowModule"), NodePath("../../InteractionController"), NodePath("../../ActivationProvider"), NodePath("../../WeaponModule"), NodePath("../../AcidDeathModule")]
@ -155,29 +155,29 @@ _moduleNodes = [NodePath("../../InputProvider"), NodePath("../../MovementModule"
[node name="Dead" type="Node" parent="StateMachine"] [node name="Dead" type="Node" parent="StateMachine"]
script = ExtResource("5_ok250") script = ExtResource("5_ok250")
[node name="Sprites" type="Node3D" parent="." node_paths=PackedStringArray("AnimatedSprite")] [node name="AnimationProvider" type="Node3D" parent="." node_paths=PackedStringArray("AnimatedSprite")]
script = ExtResource("6_onfm2") script = ExtResource("6_onfm2")
AnimatedSprite = NodePath("AnimatedSprite3D") AnimatedSprite = NodePath("AnimatedSprite3D")
BlinkMaterial = ExtResource("7_yarib") BlinkMaterial = ExtResource("7_yarib")
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="Sprites"] [node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="AnimationProvider"]
transform = Transform3D(0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 0, 0, 0) transform = Transform3D(0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 0, 0, 0)
material_override = ExtResource("7_yarib") material_override = ExtResource("7_yarib")
pixel_size = 0.05 pixel_size = 0.05
texture_filter = 0 texture_filter = 0
sprite_frames = ExtResource("6_yq7h2") sprite_frames = ExtResource("6_yq7h2")
animation = &"idle" animation = &"idle"
frame_progress = 0.840695 frame_progress = 0.1756
script = ExtResource("9_yarib") script = ExtResource("9_yarib")
[node name="Legs" type="AnimatedSprite3D" parent="Sprites"] [node name="Legs" type="AnimatedSprite3D" parent="AnimationProvider"]
pixel_size = 0.05 pixel_size = 0.05
billboard = 1 billboard = 1
texture_filter = 0 texture_filter = 0
sprite_frames = ExtResource("7_l4f8l") sprite_frames = ExtResource("7_l4f8l")
animation = &"idle" animation = &"idle"
[node name="Sprite" type="Sprite3D" parent="Sprites"] [node name="Sprite" type="Sprite3D" parent="AnimationProvider"]
transform = Transform3D(0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 0, 0, 0) transform = Transform3D(0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 0, 0, 0)
visible = false visible = false
pixel_size = 0.05 pixel_size = 0.05

View file

@ -27,7 +27,7 @@ public partial class AnimatedShaderSprite3D : AnimatedSprite3D
FrameChanged += HandleFrameChanged; FrameChanged += HandleFrameChanged;
} }
private void HandleFrameChanged() protected void HandleFrameChanged()
{ {
_shaderMaterial.SetShaderParameter("tex", SpriteFrames.GetFrameTexture(Animation, Frame)); _shaderMaterial.SetShaderParameter("tex", SpriteFrames.GetFrameTexture(Animation, Frame));
} }

View file

@ -116,8 +116,12 @@ public partial class PlayerAnimationProvider3D : Node3D
public void Blink() public void Blink()
{ {
if (BlinkMaterial == null) return; if (AnimatedSprite.MaterialOverride is null)
AnimatedSprite.MaterialOverride = BlinkMaterial; {
return;
}
//if (BlinkMaterial == null) return;
//AnimatedSprite.MaterialOverride = BlinkMaterial;
var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride); var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride);
@ -133,8 +137,12 @@ public partial class PlayerAnimationProvider3D : Node3D
public void PlayTeleportAnimation() public void PlayTeleportAnimation()
{ {
if (BlinkMaterial == null) return; if (AnimatedSprite.MaterialOverride is null)
AnimatedSprite.MaterialOverride = BlinkMaterial; {
return;
}
//if (BlinkMaterial == null) return;
//AnimatedSprite.MaterialOverride = BlinkMaterial;
var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride); var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride);
_blinkTween?.Kill(); _blinkTween?.Kill();
_blinkTween = GTweenSequenceBuilder.New() _blinkTween = GTweenSequenceBuilder.New()
@ -149,8 +157,12 @@ public partial class PlayerAnimationProvider3D : Node3D
public void PlayUnteleportAnimation() public void PlayUnteleportAnimation()
{ {
if (BlinkMaterial == null) return; if (AnimatedSprite.MaterialOverride is null)
AnimatedSprite.MaterialOverride = BlinkMaterial; {
return;
}
//if (BlinkMaterial == null) return;
//AnimatedSprite.MaterialOverride = BlinkMaterial;
var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride); var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride);
_blinkTween?.Kill(); _blinkTween?.Kill();
_blinkTween = GTweenSequenceBuilder.New() _blinkTween = GTweenSequenceBuilder.New()

View file

@ -0,0 +1,61 @@
using Cirno.Scripts.Components.Actors;
using Cirno.Scripts.Components.Actors._3D;
using Cirno.Scripts.Enums;
using Godot;
namespace Cirno.Scripts.Components.FSM.Enemy._3D;
public partial class EnemyAnimationModule3D : ModuleBase<EnemyState, CharacterBody3D>
{
private IStateMachine<EnemyState, CharacterBody3D> _machine;
[Export] public PlayerAnimationProvider3D AnimationProvider { get; private set; }
[Export] public EnemyStorage3D Storage { get; private set; }
[Export] public ActorResourceProvider HealthProvider { get; private set; }
public override void EnterState(EnemyState state)
{
AnimationProvider.SetAnimation(Storage.AimingDirection);
AnimationProvider.SetAnimation(Vector2.Zero);
if (HealthProvider is not null)
{
HealthProvider.ResourceDecreased += HealthProviderOnResourceDecreased;
}
}
private void HealthProviderOnResourceDecreased(float oldValue, float newValue, float maxValue)
{
AnimationProvider?.Blink();
}
public override void ExitState(EnemyState state)
{
AnimationProvider.SetAnimation(Vector2.Zero);
if (HealthProvider is not null)
{
HealthProvider.ResourceDecreased -= HealthProviderOnResourceDecreased;
}
}
public override void Init(IStateMachine<EnemyState, CharacterBody3D> machine)
{
_machine = machine;
}
public override void Process(double delta)
{
AnimationProvider.SetAnimation(Storage.AimingDirection);
if (_machine.MainObject.Velocity == Vector3.Zero)
{
AnimationProvider.SetAnimation(Vector2.Zero);
}
}
public override void PhysicsProcess(double delta)
{
}
}

View file

@ -0,0 +1 @@
uid://ts64slgd7twt

View file

@ -1,4 +1,5 @@
using Cirno.Scripts.Components.Actors; using Cirno.Scripts.Components.Actors;
using Cirno.Scripts.Components.Actors._3D;
using Cirno.Scripts.Enums; using Cirno.Scripts.Enums;
using Godot; using Godot;
@ -9,20 +10,22 @@ public partial class EnemyDamageModule3D : ModuleBase<EnemyState, CharacterBody3
[Export] public DamageReceiver3D DamageReceiver { get; private set; } [Export] public DamageReceiver3D DamageReceiver { get; private set; }
[Export] public EnemyStorage3D StorageModule { get; private set; } [Export] public EnemyStorage3D StorageModule { get; private set; }
[Export] public PlayerAnimationProvider3D AnimationProvider { get; private set; }
private IStateMachine<EnemyState, CharacterBody3D> _machine; private IStateMachine<EnemyState, CharacterBody3D> _machine;
public override void EnterState(EnemyState state) public override void EnterState(EnemyState state)
{ {
DamageReceiver.ChangeState(true); DamageReceiver.ChangeState(true);
DamageReceiver.HealthProvider.ResourceDepleted += HealthProviderOnResourceDepleted; DamageReceiver.HealthProvider.ResourceDepleted += HealthProviderOnResourceDepleted;
// DamageReceiver.HealthProvider.ResourceDecreased += HealthProviderOnResourceDecreased; DamageReceiver.HealthProvider.ResourceDecreased += HealthProviderOnResourceDecreased;
} }
public override void ExitState(EnemyState state) public override void ExitState(EnemyState state)
{ {
DamageReceiver.HealthProvider.ResourceDepleted -= HealthProviderOnResourceDepleted; DamageReceiver.HealthProvider.ResourceDepleted -= HealthProviderOnResourceDepleted;
// DamageReceiver.HealthProvider.ResourceDecreased -= HealthProviderOnResourceDecreased; DamageReceiver.HealthProvider.ResourceDecreased -= HealthProviderOnResourceDecreased;
DamageReceiver.ChangeState(false); DamageReceiver.ChangeState(false);
} }
@ -43,8 +46,13 @@ public partial class EnemyDamageModule3D : ModuleBase<EnemyState, CharacterBody3
private void HealthProviderOnResourceDecreased(float oldvalue, float newvalue, float maxvalue) private void HealthProviderOnResourceDecreased(float oldvalue, float newvalue, float maxvalue)
{ {
StorageModule.AiState = AiState.Enabled; if (_machine.GetState() is EnemyState.Idle)
_machine.SetState(EnemyState.Alert); {
StorageModule.AiState = AiState.Enabled;
_machine.SetState(EnemyState.Alert);
}
AnimationProvider.Blink();
} }
private void HealthProviderOnResourceDepleted() private void HealthProviderOnResourceDepleted()

View file

@ -1,20 +1,30 @@
using Cirno.Scripts.Resources; using Cirno.Scripts.Components.Actors._3D;
using Cirno.Scripts.Resources;
using Godot; using Godot;
namespace Cirno.Scripts.Components.FSM.Enemy._3D; namespace Cirno.Scripts.Components.FSM.Enemy._3D;
public partial class EnemyFSMAnimatedSprite3D : AnimatedSprite3D [Tool]
public partial class EnemyFSMAnimatedSprite3D : AnimatedShaderSprite3D
{ {
[Export] public EnemyProxy3D EnemyProxy { get; private set; } //[Export] public EnemyProxy3D EnemyProxy { get; private set; }
public override void _Ready() public override void _Ready()
{ {
base._Ready();
//EnemyProxy.Initialized += EnemyFsmProxyOnInitialized; //EnemyProxy.Initialized += EnemyFsmProxyOnInitialized;
this.SpriteFrames = EnemyProxy.EnemyResource.AnimationFrames; if (!Engine.IsEditorHint())
{
var enemyProxy = GetParent<EnemyProxy3D>();
this.SpriteFrames = enemyProxy.EnemyResource.AnimationFrames;
HandleFrameChanged();
}
} }
private void EnemyFsmProxyOnInitialized(EnemyResource resource) private void EnemyFsmProxyOnInitialized(EnemyResource resource)
{ {
if (Engine.IsEditorHint()) return;
this.SpriteFrames = resource.AnimationFrames; this.SpriteFrames = resource.AnimationFrames;
} }
} }

View file

@ -12,6 +12,7 @@ public interface IStateMachine<TKey, [MustBeVariant] TType>
public IState<TKey, TType> CurrentState { get; } public IState<TKey, TType> CurrentState { get; }
public TKey InitialState { get; } public TKey InitialState { get; }
public void SetState(TKey stateId); public void SetState(TKey stateId);
public TKey GetState();
public TType MainObject { get; } public TType MainObject { get; }
} }

View file

@ -31,6 +31,11 @@ public abstract partial class IsoStateMachineBase<TKey, TType> : Node, IStateMac
SetState(InitialState); SetState(InitialState);
} }
public TKey GetState()
{
return CurrentState.StateId;
}
public void SetState(TKey stateId) public void SetState(TKey stateId)
{ {
if (CurrentStateIndex is not null) if (CurrentStateIndex is not null)

View file

@ -31,6 +31,11 @@ public abstract partial class StateMachineBase<TKey, TType> : Node, IStateMachin
SetState(InitialState); SetState(InitialState);
} }
public TKey GetState()
{
return CurrentState.StateId;
}
public void SetState(TKey stateId) public void SetState(TKey stateId)
{ {
if (CurrentStateIndex is not null) if (CurrentStateIndex is not null)