using System;
using UnityEngine;
using XGame.Framework.Components;
using XGame.Framework.Interfaces;
namespace XGame.Framework.Map
{
///
/// Entity实例
///
///
public abstract class EntityView : IEntityView, IMapContextSetter, IEntityProxy, IDisposable where TViewModel : class, IEntityViewModel
{
private MapContext _context;
protected MapContext Context => _context;
private EntityBehaviour _behaviour;
private TViewModel _viewModel;
private ComponentGroup _componentGroup;
protected ComponentGroup Group => _componentGroup;
protected TViewModel VM => _viewModel;
public Vector3 LocalPosition { get => _behaviour.transform.localPosition; set => _behaviour.transform.localPosition = value; }
public Vector3 Position { get => _behaviour.transform.position; set => _behaviour.transform.position = value; }
public Vector3 Rotation { get => _behaviour.transform.rotation.eulerAngles; set => _behaviour.transform.rotation = Quaternion.Euler(value); }
protected bool IsInited { get; private set; }
private void Init()
{
IsInited = true;
_viewModel = Activator.CreateInstance();
(_viewModel as EntityViewModel)?.Init(_behaviour);
if (_componentGroup == null)
{
_componentGroup = new ComponentGroup(this);
}
OnInited();
}
#region 接口实现
public TComponent GetComponent(bool autoCreate = true) where TComponent : class, IComponent
{
var component = _componentGroup.Get();
if (autoCreate && component == null)
{
component = Activator.CreateInstance();
//component.Bind(this);
_componentGroup.Add(component);
if (Active && component is IActiveable activeable)
{ // EntityView处于激活状态,激活Component
activeable.Enable();
}
}
return component;
}
MapContext IMapContextSetter.Context { set => _context = value; }
EntityBehaviour IEntityProxy.Behaviour
{
get => _behaviour;
set
{
_behaviour = value;
Init();
}
}
public bool Active { get; private set; }
public void Enable(object intent)
{
if (Active) return;
Active = true;
_behaviour.gameObject.SetActive(true);
_componentGroup.Enable(intent);
OnEnable(intent);
}
public void Disable()
{
if (!Active) return;
Active = false;
_behaviour.gameObject.SetActive(false);
_componentGroup.Disable();
OnDisable();
}
void IDisposable.Dispose()
{
IsInited = false;
OnDispose();
_componentGroup.Dispose();
(_viewModel as IDisposable)?.Dispose();
_viewModel = null;
_behaviour = null;
_context = null;
}
public void Clear()
{
if (!IsInited) return;
IsInited = false;
OnDispose();
_componentGroup.Clear();
(_viewModel as IDisposable)?.Dispose();
_viewModel = null;
_behaviour = null;
_context = null;
}
#endregion
//protected abstract IEntityViewModel CtreatViewModel(IObjectCollector collector);
protected abstract void OnEnable(object intent);
protected abstract void OnDisable();
protected virtual void OnInited()
{
}
protected virtual void OnDispose()
{
}
}
}