Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / activity / Component.cs
@lijincheng lijincheng on 13 Feb 2023 5 KB 协程支持
  1.  
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 组件基类, 用于挂载到游戏物体上, 相比于原生 Node 更加轻量化, 实例化 Component 不会创建额外的 Node, 可以大量添加组件
  6. /// </summary>
  7. public abstract class Component : IProcess, IDestroy
  8. {
  9. /// <summary>
  10. /// 当前组件所挂载的游戏对象
  11. /// </summary>
  12. public ActivityObject ActivityInstance { get; internal set; }
  13.  
  14. /// <summary>
  15. /// 当前组件所挂载的物体的坐标
  16. /// </summary>
  17. public Vector2 Position
  18. {
  19. get => ActivityInstance.Position;
  20. set => ActivityInstance.Position = value;
  21. }
  22.  
  23. /// <summary>
  24. /// 当前组件所挂载物体的全局坐标
  25. /// </summary>
  26. public Vector2 GlobalPosition
  27. {
  28. get => ActivityInstance.GlobalPosition;
  29. set => ActivityInstance.GlobalPosition = value;
  30. }
  31.  
  32. /// <summary>
  33. /// 当前组件所挂载物体的缩放
  34. /// </summary>
  35. public Vector2 Scale
  36. {
  37. get => ActivityInstance.Scale;
  38. set => ActivityInstance.Scale = value;
  39. }
  40. /// <summary>
  41. /// 当前组件所挂载物体的全局缩放
  42. /// </summary>
  43. public Vector2 GlobalScale
  44. {
  45. get => ActivityInstance.GlobalScale;
  46. set => ActivityInstance.GlobalScale = value;
  47. }
  48.  
  49. /// <summary>
  50. /// 当前组件所挂载物体的旋转角度
  51. /// </summary>
  52. public float Rotation
  53. {
  54. get => ActivityInstance.Rotation;
  55. set => ActivityInstance.Rotation = value;
  56. }
  57. /// <summary>
  58. /// 当前组件所挂载物体的全局旋转角度
  59. /// </summary>
  60. public float GlobalRotation
  61. {
  62. get => ActivityInstance.GlobalRotation;
  63. set => ActivityInstance.GlobalRotation = value;
  64. }
  65.  
  66. /// <summary>
  67. /// 当前组件所挂载物体的角度制旋转角度
  68. /// </summary>
  69. public float RotationDegrees
  70. {
  71. get => ActivityInstance.RotationDegrees;
  72. set => ActivityInstance.RotationDegrees = value;
  73. }
  74. /// <summary>
  75. /// 当前组件所挂载物体的全局角度制旋转角度
  76. /// </summary>
  77. public float GlobalRotationDegrees
  78. {
  79. get => ActivityInstance.GlobalRotationDegrees;
  80. set => ActivityInstance.GlobalRotationDegrees = value;
  81. }
  82. /// <summary>
  83. /// 当前组件所挂载物体的ZIndex
  84. /// </summary>
  85. public int ZIndex
  86. {
  87. get => ActivityInstance.ZIndex;
  88. set => ActivityInstance.ZIndex = value;
  89. }
  90. /// <summary>
  91. /// 当前组件是否显示
  92. /// </summary>
  93. public bool Visible
  94. {
  95. get => ActivityInstance.Visible;
  96. set => ActivityInstance.Visible = value;
  97. }
  98.  
  99. /// <summary>
  100. /// 挂载物体的动画节点
  101. /// </summary>
  102. public AnimatedSprite2D AnimatedSprite2D => ActivityInstance.AnimatedSprite;
  103. /// <summary>
  104. /// 挂载物体的阴影节点
  105. /// </summary>
  106. public Sprite2D ShadowSprite => ActivityInstance.ShadowSprite;
  107. /// <summary>
  108. /// 挂载物体的碰撞器节点
  109. /// </summary>
  110. public CollisionShape2D Collision => ActivityInstance.Collision;
  111.  
  112. /// <summary>
  113. /// 是否启用当前组件, 如果禁用, 则不会调用 Process 和 PhysicsProcess
  114. /// </summary>
  115. public bool Enable
  116. {
  117. get => _enable;
  118. set
  119. {
  120. if (!_enable && value)
  121. {
  122. OnEnable();
  123. }
  124. else if (_enable && !value)
  125. {
  126. OnDisable();
  127. }
  128.  
  129. _enable = value;
  130. }
  131. }
  132.  
  133. private bool _enable = true;
  134.  
  135. /// <summary>
  136. /// 是否被销毁
  137. /// </summary>
  138. public bool IsDestroyed { get; private set; }
  139.  
  140. /// <summary>
  141. /// 是否调用过 Ready 函数
  142. /// </summary>
  143. public bool IsReady { get; set; }
  144.  
  145. /// <summary>
  146. /// 第一次调用 Process 或 PhysicsProcess 之前调用
  147. /// </summary>
  148. public virtual void Ready()
  149. {
  150. }
  151.  
  152. /// <summary>
  153. /// 如果启用了组件, 则每帧会调用一次 Process
  154. /// </summary>
  155. /// <param name="delta"></param>
  156. public virtual void Process(float delta)
  157. {
  158. }
  159.  
  160. /// <summary>
  161. /// 如果启用了组件, 则每物理帧会调用一次 PhysicsProcess
  162. /// </summary>
  163. /// <param name="delta"></param>
  164. public virtual void PhysicsProcess(float delta)
  165. {
  166. }
  167.  
  168. /// <summary>
  169. /// 当组件被销毁时调用
  170. /// </summary>
  171. public virtual void OnDestroy()
  172. {
  173. }
  174.  
  175. /// <summary>
  176. /// 当组件启用时调用
  177. /// </summary>
  178. public virtual void OnEnable()
  179. {
  180. }
  181.  
  182. /// <summary>
  183. /// 当组件禁用时调用
  184. /// </summary>
  185. public virtual void OnDisable()
  186. {
  187. }
  188.  
  189. /// <summary>
  190. /// 如果开启 debug, 则每帧调用该函数, 可用于绘制文字线段等, 需要调用 ActivityInstance 身上的绘制函数
  191. /// </summary>
  192. public virtual void DebugDraw()
  193. {
  194. }
  195.  
  196. /// <summary>
  197. /// 当组件销毁
  198. /// </summary>
  199. public void Destroy()
  200. {
  201. if (IsDestroyed)
  202. {
  203. return;
  204. }
  205.  
  206. IsDestroyed = true;
  207. ActivityInstance.RemoveComponent(this);
  208. OnDestroy();
  209. }
  210. }