diff --git a/DungeonShooting_Godot/addons/dungeonShooting_plugin/Plugin.cs b/DungeonShooting_Godot/addons/dungeonShooting_plugin/Plugin.cs index 2ba1f9f..0a88097 100644 --- a/DungeonShooting_Godot/addons/dungeonShooting_plugin/Plugin.cs +++ b/DungeonShooting_Godot/addons/dungeonShooting_plugin/Plugin.cs @@ -43,12 +43,6 @@ private CustomTypeInfo[] _customTypeInfos = new CustomTypeInfo[] { new CustomTypeInfo( - "ActivityObjectTemplate", - "Node", - "res://src/framework/activity/ActivityObjectTemplate.cs", - "res://addons/dungeonShooting_plugin/ActivityObject.svg" - ), - new CustomTypeInfo( "ActivityMark", "Node2D", "res://src/framework/map/mark/ActivityMark.cs", diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index 44a8fd3..da5607c 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -10,6 +10,7 @@ /// ActivityObject 子类实例化请不要直接使用 new, 而用该在类上标上 [RegisterActivity(id, prefabPath)], /// ActivityObject 类会自动扫描并注册物体, 然后使用而是使用 ActivityObject.Create(id) 来创建实例 /// +[Tool] public abstract partial class ActivityObject : CharacterBody2D, IDestroy { /// @@ -212,9 +213,7 @@ //开启的协程 private List _coroutineList; - //模板实例 - private ActivityObjectTemplate _templateInstance; - + //物体所在区域 private AffiliationArea _affiliationArea; @@ -244,56 +243,21 @@ private static long _instanceIndex = 0; //初始化节点 - private void _InitNode(string itemId, string scenePath, World world) + private void _InitNode(string itemId, World world) { World = world; - //加载预制体 - var tempPrefab = ResourceManager.Load(scenePath); - if (tempPrefab == null) - { - throw new Exception("创建 ActivityObject 没有找到指定挂载的预制体: " + scenePath); - } ItemId = itemId; Name = GetType().Name + (_instanceIndex++); - _templateInstance = tempPrefab.Instantiate(); - //移动子节点 - var count = _templateInstance.GetChildCount(); - for (int i = 0; i < count; i++) - { - var body = _templateInstance.GetChild(0); - _templateInstance.RemoveChild(body); - AddChild(body); - body.Owner = this; - switch (body.Name) - { - case "AnimatedSprite": - AnimatedSprite = (AnimatedSprite2D)body; - _blendShaderMaterial = AnimatedSprite.Material as ShaderMaterial; - break; - case "ShadowSprite": - ShadowSprite = (Sprite2D)body; - ShadowSprite.Visible = false; - break; - case "Collision": - Collision = (CollisionShape2D)body; - break; - } - } - - ZIndex = _templateInstance.z_index; - CollisionLayer = _templateInstance.collision_layer; - CollisionMask = _templateInstance.collision_mask; - Scale = _templateInstance.scale; - Visible = _templateInstance.visible; + AnimatedSprite = GetNode("AnimatedSprite"); + _blendShaderMaterial = AnimatedSprite.Material as ShaderMaterial; + ShadowSprite = GetNode("ShadowSprite"); + ShadowSprite.Visible = false; + Collision = GetNode("Collision"); MotionMode = MotionModeEnum.Floating; - MoveController = AddComponent(); - - //临时处理, 4.0 有bug, 不能销毁模板实例, 不然关闭游戏会报错!!! - //_templateInstance.CallDeferred(Node.MethodName.QueueFree); OnInit(); } @@ -303,6 +267,86 @@ /// public sealed override void _Ready() { +#if TOOLS + // 在工具模式下创建的 template 节点自动创建对应的必要子节点 + if (Engine.IsEditorHint()) + { + var parent = GetParent(); + if (parent != null) + { + //寻找 owner + Node owner; + if (parent.Owner != null) + { + owner = parent.Owner; + } + else if (Plugin.Plugin.Instance.GetEditorInterface().GetEditedSceneRoot() == this) + { + owner = this; + } + else + { + owner = parent; + } + + var sprite = GetNodeOrNull("ShadowSprite"); + //创建Shadow + if (sprite == null) + { + sprite = new Sprite2D(); + sprite.Name = "ShadowSprite"; + sprite.ZIndex = -1; + var material = + ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); + material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); + material.SetShaderParameter("schedule", 1); + sprite.Material = material; + AddChild(sprite); + sprite.Owner = owner; + } + else if (sprite.Material == null) + { + var material = + ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); + material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); + material.SetShaderParameter("schedule", 1); + sprite.Material = material; + } + + var animatedSprite = GetNodeOrNull("AnimatedSprite"); + //创建 Sprite2D + if (animatedSprite == null) + { + animatedSprite = new AnimatedSprite2D(); + animatedSprite.Name = "AnimatedSprite"; + var material = + ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); + material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); + material.SetShaderParameter("schedule", 0); + animatedSprite.Material = material; + AddChild(animatedSprite); + animatedSprite.Owner = owner; + } + else if (animatedSprite.Material == null) + { + var material = + ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); + material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); + material.SetShaderParameter("schedule", 0); + animatedSprite.Material = material; + } + + //创建Collision + if (GetNodeOrNull("Collision") == null) + { + var co = new CollisionShape2D(); + co.Name = "Collision"; + AddChild(co); + co.Owner = owner; + } + } + } +#endif } /// @@ -1024,9 +1068,6 @@ { AffiliationArea.RemoveItem(this); } - - //临时处理, 4.0 有bug, 不能提前销毁模板实例, 不然关闭游戏会报错!!! - _templateInstance.QueueFree(); } /// diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObjectTemplate.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObjectTemplate.cs index 6ead626..4e7ccbd 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObjectTemplate.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObjectTemplate.cs @@ -1,127 +1,127 @@ -using Godot; - -/// -/// ActivityObject 节点模板对象 -/// -[Tool] -public partial class ActivityObjectTemplate : Node -{ - // /// - // /// 默认放入的层级 - // /// - // [Export] public RoomLayerEnum DefaultLayer = RoomLayerEnum.NormalLayer; - - /// - /// 是否是静态物体 - /// - [Export] public bool IsStatic = false; - - /// - /// 物体初始缩放 - /// - [Export] public Vector2 scale = Vector2.One; - - /// - /// 当前物体所属物理层 - /// - [Export(PropertyHint.Layers2DPhysics)] public uint collision_layer; - - /// - /// 当前物体扫描的物理层 - /// - [Export(PropertyHint.Layers2DPhysics)] public uint collision_mask; - - /// - /// 显示状态 - /// - [Export] public bool visible = true; - - /// - /// 当前物体渲染层级 - /// - [Export] public int z_index; - - public override void _Ready() - { -#if TOOLS - // 在工具模式下创建的 template 节点自动创建对应的必要子节点 - if (Engine.IsEditorHint()) - { - var parent = GetParent(); - if (parent != null) - { - //寻找 owner - Node owner; - if (parent.Owner != null) - { - owner = parent.Owner; - } - else if (Plugin.Plugin.Instance.GetEditorInterface().GetEditedSceneRoot() == this) - { - owner = this; - } - else - { - owner = parent; - } - - var sprite = GetNodeOrNull("ShadowSprite"); - //创建Shadow - if (sprite == null) - { - sprite = new Sprite2D(); - sprite.Name = "ShadowSprite"; - sprite.ZIndex = -1; - var material = - ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); - material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); - material.SetShaderParameter("schedule", 1); - sprite.Material = material; - AddChild(sprite); - sprite.Owner = owner; - } - else if (sprite.Material == null) - { - var material = - ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); - material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); - material.SetShaderParameter("schedule", 1); - sprite.Material = material; - } - - var animatedSprite = GetNodeOrNull("AnimatedSprite"); - //创建 Sprite2D - if (animatedSprite == null) - { - animatedSprite = new AnimatedSprite2D(); - animatedSprite.Name = "AnimatedSprite"; - var material = - ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); - material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); - material.SetShaderParameter("schedule", 0); - animatedSprite.Material = material; - AddChild(animatedSprite); - animatedSprite.Owner = owner; - } - else if (animatedSprite.Material == null) - { - var material = - ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); - material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); - material.SetShaderParameter("schedule", 0); - animatedSprite.Material = material; - } - - //创建Collision - if (GetNodeOrNull("Collision") == null) - { - var co = new CollisionShape2D(); - co.Name = "Collision"; - AddChild(co); - co.Owner = owner; - } - } - } -#endif - } -} \ No newline at end of file +// using Godot; +// +// /// +// /// ActivityObject 节点模板对象 +// /// +// [Tool] +// public partial class ActivityObjectTemplate : Node +// { +// // /// +// // /// 默认放入的层级 +// // /// +// // [Export] public RoomLayerEnum DefaultLayer = RoomLayerEnum.NormalLayer; +// +// /// +// /// 是否是静态物体 +// /// +// [Export] public bool IsStatic = false; +// +// /// +// /// 物体初始缩放 +// /// +// [Export] public Vector2 scale = Vector2.One; +// +// /// +// /// 当前物体所属物理层 +// /// +// [Export(PropertyHint.Layers2DPhysics)] public uint collision_layer; +// +// /// +// /// 当前物体扫描的物理层 +// /// +// [Export(PropertyHint.Layers2DPhysics)] public uint collision_mask; +// +// /// +// /// 显示状态 +// /// +// [Export] public bool visible = true; +// +// /// +// /// 当前物体渲染层级 +// /// +// [Export] public int z_index; +// +// public override void _Ready() +// { +// #if TOOLS +// // 在工具模式下创建的 template 节点自动创建对应的必要子节点 +// if (Engine.IsEditorHint()) +// { +// var parent = GetParent(); +// if (parent != null) +// { +// //寻找 owner +// Node owner; +// if (parent.Owner != null) +// { +// owner = parent.Owner; +// } +// else if (Plugin.Plugin.Instance.GetEditorInterface().GetEditedSceneRoot() == this) +// { +// owner = this; +// } +// else +// { +// owner = parent; +// } +// +// var sprite = GetNodeOrNull("ShadowSprite"); +// //创建Shadow +// if (sprite == null) +// { +// sprite = new Sprite2D(); +// sprite.Name = "ShadowSprite"; +// sprite.ZIndex = -1; +// var material = +// ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); +// material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); +// material.SetShaderParameter("schedule", 1); +// sprite.Material = material; +// AddChild(sprite); +// sprite.Owner = owner; +// } +// else if (sprite.Material == null) +// { +// var material = +// ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); +// material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); +// material.SetShaderParameter("schedule", 1); +// sprite.Material = material; +// } +// +// var animatedSprite = GetNodeOrNull("AnimatedSprite"); +// //创建 Sprite2D +// if (animatedSprite == null) +// { +// animatedSprite = new AnimatedSprite2D(); +// animatedSprite.Name = "AnimatedSprite"; +// var material = +// ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); +// material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); +// material.SetShaderParameter("schedule", 0); +// animatedSprite.Material = material; +// AddChild(animatedSprite); +// animatedSprite.Owner = owner; +// } +// else if (animatedSprite.Material == null) +// { +// var material = +// ResourceManager.Load(ResourcePath.resource_material_Blend_tres, false); +// material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); +// material.SetShaderParameter("schedule", 0); +// animatedSprite.Material = material; +// } +// +// //创建Collision +// if (GetNodeOrNull("Collision") == null) +// { +// var co = new CollisionShape2D(); +// co.Name = "Collision"; +// AddChild(co); +// co.Owner = owner; +// } +// } +// } +// #endif +// } +// } \ No newline at end of file