mirror of
https://github.com/hanzoai/ProjectTinySamples.git
synced 2026-09-24 00:01:34 +00:00
127 lines
4.3 KiB
C#
127 lines
4.3 KiB
C#
using Unity.Collections;
|
|
using Unity.Entities;
|
|
using Unity.Mathematics;
|
|
using Unity.Tiny.Rendering;
|
|
using Unity.Transforms;
|
|
|
|
namespace Unity.TinyGems
|
|
{
|
|
public class HeartSystem : SystemBase
|
|
{
|
|
private Scenes m_CurrentScene = Scenes.None;
|
|
private int m_NoOfHearts = -1;
|
|
private EntityQuery m_BackgroundQuery;
|
|
private EntityCommandBuffer m_CmdBuffer;
|
|
|
|
protected override void OnCreate()
|
|
{
|
|
base.OnCreate();
|
|
|
|
RequireSingletonForUpdate<HeartManager>();
|
|
RequireSingletonForUpdate<ActiveScene>();
|
|
RequireSingletonForUpdate<GameStateData>();
|
|
RequireSingletonForUpdate<Camera>();
|
|
|
|
m_BackgroundQuery = GetEntityQuery(typeof(HeartBackground));
|
|
}
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
var activeScene = GetSingleton<ActiveScene>();
|
|
m_CmdBuffer = new EntityCommandBuffer(Allocator.TempJob);
|
|
|
|
if (activeScene.Value != m_CurrentScene)
|
|
SceneChangeUpdate(activeScene);
|
|
else if(activeScene.Value == Scenes.Game)
|
|
HeartReduction();
|
|
|
|
m_CmdBuffer.Playback(EntityManager);
|
|
m_CmdBuffer.Dispose();
|
|
}
|
|
|
|
private void SceneChangeUpdate(ActiveScene activeScene)
|
|
{
|
|
if (activeScene.Value == Scenes.Title)
|
|
DestroyHearts();
|
|
else if(activeScene.Value == Scenes.Game)
|
|
SpawnHearts();
|
|
|
|
m_CurrentScene = activeScene.Value;
|
|
}
|
|
|
|
private void DestroyHearts()
|
|
{
|
|
m_CmdBuffer.DestroyEntity(m_BackgroundQuery);
|
|
|
|
var heartManagerEntity = GetSingletonEntity<HeartManager>();
|
|
var heartBuffers = GetBufferFromEntity<Heart>();
|
|
if (!heartBuffers.HasComponent(heartManagerEntity))
|
|
return;
|
|
|
|
var hearts = heartBuffers[heartManagerEntity];
|
|
|
|
for(var i = 0; i < hearts.Length; i++)
|
|
m_CmdBuffer.DestroyEntity(hearts[i].Value);
|
|
hearts.Clear();
|
|
}
|
|
|
|
private void SpawnHearts()
|
|
{
|
|
var gameState = GetSingleton<GameStateData>();
|
|
var heartManager = GetSingleton<HeartManager>();
|
|
var heartManagerEntity = GetSingletonEntity<HeartManager>();
|
|
|
|
gameState.Hearts = heartManager.NoOfHearts;
|
|
SetSingleton(gameState);
|
|
|
|
var camEntity = GetSingletonEntity<Camera>();
|
|
var camTr = EntityManager.GetComponentData<Translation>(camEntity);
|
|
var cam = GetSingleton<Camera>();
|
|
var top = cam.fov - 0.5f;
|
|
var right = top * cam.aspect;
|
|
var heartAnchor = new float3(right + camTr.Value.x, top + camTr.Value.y, 0);
|
|
|
|
var heartBuffer = m_CmdBuffer.AddBuffer<Heart>(heartManagerEntity);
|
|
|
|
for (var i = 0; i < gameState.Hearts; i++)
|
|
{
|
|
var translation = new Translation
|
|
{
|
|
Value = heartAnchor
|
|
};
|
|
|
|
var heartBackground = m_CmdBuffer.Instantiate(heartManager.HeartBackgroundPrefab);
|
|
var heart = m_CmdBuffer.Instantiate(heartManager.HeartPrefab);
|
|
|
|
m_CmdBuffer.SetComponent(heartBackground, translation);
|
|
m_CmdBuffer.SetComponent(heart, translation);
|
|
|
|
m_CmdBuffer.AddComponent(heartBackground, typeof(HeartBackground));
|
|
|
|
heartBuffer.Add(new Heart()
|
|
{
|
|
Value = heart
|
|
});
|
|
|
|
heartAnchor.x--;
|
|
}
|
|
|
|
m_NoOfHearts = gameState.Hearts;
|
|
}
|
|
|
|
private void HeartReduction()
|
|
{
|
|
var gameState = GetSingleton<GameStateData>();
|
|
if (gameState.Hearts == m_NoOfHearts)
|
|
return;
|
|
|
|
var heartManagerEntity = GetSingletonEntity<HeartManager>();
|
|
var heartBuffers = GetBufferFromEntity<Heart>();
|
|
|
|
var hearts = heartBuffers[heartManagerEntity];
|
|
m_CmdBuffer.AddComponent<Disabled>(hearts[gameState.Hearts].Value);
|
|
|
|
m_NoOfHearts = gameState.Hearts;
|
|
}
|
|
}
|
|
} |