2023-03-26 11:20:02 +08:00
using System.Runtime.CompilerServices ;
using UnityEngine ;
2024-06-13 18:04:47 +08:00
using DCFApixels.DragonECS.Unity ;
2023-03-26 11:20:02 +08:00
#if UNITY_EDITOR
using UnityEditor ;
#endif
2023-03-29 19:58:58 +08:00
namespace DCFApixels.DragonECS
2023-03-26 11:20:02 +08:00
{
2024-03-03 03:51:49 +08:00
[MetaColor(MetaColor.Cyan)]
2024-06-13 18:04:47 +08:00
[MetaGroup(EcsUnityConsts.PACK_GROUP, EcsConsts.COMPONENTS_GROUP)]
[MetaDescription(EcsConsts.AUTHOR, "This component is automatically added if an entity is connected to one of the EcsEntityConnect. It also contains a reference to the connected EcsEntityConnect.")]
2024-03-10 22:27:17 +08:00
public readonly struct GameObjectConnect : IEcsComponent , IEcsComponentLifecycle < GameObjectConnect >
2023-03-26 11:20:02 +08:00
{
2024-03-10 22:27:17 +08:00
public readonly EcsEntityConnect Connect ;
2024-03-10 10:20:44 +08:00
public bool IsConnected
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2024-03-10 22:27:17 +08:00
get { return Connect ! = null ; }
2024-03-10 10:20:44 +08:00
}
2024-03-10 22:27:17 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal GameObjectConnect ( EcsEntityConnect connect )
2023-03-26 11:20:02 +08:00
{
2024-03-10 22:27:17 +08:00
Connect = connect ;
2023-03-26 11:20:02 +08:00
}
2024-03-10 19:23:05 +08:00
2024-03-10 22:27:17 +08:00
void IEcsComponentLifecycle < GameObjectConnect > . Enable ( ref GameObjectConnect component )
2024-03-10 19:23:05 +08:00
{
component = default ;
}
2024-03-10 22:27:17 +08:00
void IEcsComponentLifecycle < GameObjectConnect > . Disable ( ref GameObjectConnect component )
2024-03-10 19:23:05 +08:00
{
2024-03-10 22:27:17 +08:00
if ( component . Connect ! = null )
2024-03-10 19:23:05 +08:00
{
2024-03-10 22:27:17 +08:00
component . Connect . Disconnect ( ) ;
2024-03-10 19:23:05 +08:00
}
component = default ;
}
2023-03-26 11:20:02 +08:00
}
public enum GameObjectIcon : byte
{
NONE ,
Label_Gray ,
Label_Blue ,
Label_Teal ,
Label_Green ,
Label_Yellow ,
Label_Orange ,
Label_Red ,
Label_Purple ,
Circle_Gray ,
Circle_Blue ,
Circle_Teal ,
Circle_Green ,
Circle_Yellow ,
Circle_Orange ,
Circle_Red ,
Circle_Purple ,
Diamond_Gray ,
Diamond_Blue ,
Diamond_Teal ,
Diamond_Green ,
Diamond_Yellow ,
Diamond_Orange ,
Diamond_Red ,
Diamond_Purple
}
2024-03-10 22:27:17 +08:00
internal static class GameObjectIconConsts
2023-03-26 11:20:02 +08:00
{
public const int RAW_LABEL_ICON_LAST = ( int ) GameObjectIcon . Label_Purple ;
}
public static class GameObjectRefExt
{
2024-03-03 03:51:49 +08:00
public static entlong NewEntityWithGameObject ( this EcsWorld self , string name = "Entity" , GameObjectIcon icon = GameObjectIcon . NONE )
2023-03-26 11:20:02 +08:00
{
2024-03-03 03:51:49 +08:00
entlong result = self . NewEntityLong ( ) ;
2023-03-26 11:20:02 +08:00
GameObject newGameObject = new GameObject ( name ) ;
2024-03-10 09:50:20 +08:00
newGameObject . AddComponent < EcsEntityConnect > ( ) . ConnectWith ( result , false ) ;
2023-03-26 11:20:02 +08:00
#if UNITY_EDITOR
if ( icon ! = GameObjectIcon . NONE )
{
string contentName ;
int number = ( int ) icon - 1 ;
if ( number < GameObjectIconConsts . RAW_LABEL_ICON_LAST )
{
contentName = $"sv_label_{number}" ;
}
else
{
number - = GameObjectIconConsts . RAW_LABEL_ICON_LAST ;
contentName = $"sv_icon_dot{number}_pix16_gizmo" ;
}
GUIContent iconContent = EditorGUIUtility . IconContent ( contentName ) ;
EditorGUIUtility . SetIconForObject ( newGameObject , ( Texture2D ) iconContent . image ) ;
}
#endif
return result ;
}
}
}