2025-05-18 01:04:31 +08:00

163 lines
5.1 KiB
C#

// ***********************************************************************
// Assembly : Unity
// Author : Kimch
// Created : 2019-06-01
// Description : 实体表现类
// Last Modified By :
// Last Modified On :
// ***********************************************************************
// <copyright file= "EntityView" company="DefaultCompany"></copyright>
// <summary></summary>
// ***********************************************************************
using F.ObjectPool;
using UnityEngine;
namespace G
{
public class EntityView : System.IDisposable
{
private readonly Entity _entity;
/// <summary>
/// 所属实体
/// </summary>
public Entity entity
{
get { return _entity; }
}
/// <summary>
///
/// </summary>
public bool initSuccess
{
get;
private set;
}
/// <summary>
///
/// </summary>
public GameObject gameObject
{
get;
private set;
}
/// <summary>
///
/// </summary>
public Transform transform
{
get { return gameObject.transform; }
}
/// <summary>
///
/// </summary>
public Renderer mainRenderer
{
get;
private set;
}
#region Method
public EntityView(Entity entity)
{
_entity = entity;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public async void Init(System.Action callback)
{
var entityType = _entity.entityType;
switch (entityType)
{
case EntityType.Minion:
var minionItem = ItemProxy.Instance.GetStaticItem<ItemMinion>(_entity.itemId);
var minionPrefab = await AssetProxy.Instance.TryGetAssetAsync<GameObject>(minionItem.assets.ToLower(), EntityManager.ASSET_POOL_NAME).Task;
gameObject = SpawnPool.Spawn(minionPrefab, Vector3.zero, Vector3.zero, _entity.transform);
callback?.Invoke();
break;
case EntityType.Boss:
var bossItem = ItemProxy.Instance.GetStaticItem<ItemBoss>(_entity.itemId);
var bossPrefab = await AssetProxy.Instance.TryGetAssetAsync<GameObject>(bossItem.assets.ToLower(), EntityManager.ASSET_POOL_NAME).Task;
gameObject = SpawnPool.Spawn(bossPrefab, Vector3.zero, Vector3.zero, _entity.transform);
callback?.Invoke();
break;
case EntityType.MainPlayer:
var playerEntity = (EntityPlayer)_entity;
//var chaSkin = PlayerProxy.Instance.GetCurrentChaSkin();
//int skinIndex = chaSkin != null ? Mathf.Clamp(chaSkin.id - 2000 + 1, 1, 4) : 1;
var chaPrefabName = PlayerProxy.Instance.GetCurrentChaModel();
var chaPrefab = await AssetProxy.Instance.TryGetAssetAsync<GameObject>(chaPrefabName, EntityManager.ASSET_POOL_NAME).Task;
gameObject = Object.Instantiate(chaPrefab, playerEntity.transform);
gameObject.SetActive(true);
gameObject.AddComponent<Cha_AnimationEvent>();
//playerEntity.SetModel(gameObject);
mainRenderer = gameObject.GetComponentInChildren<SkinnedMeshRenderer>();
callback?.Invoke();
break;
case EntityType.Pet:
var petEntity = (EntityPet)_entity;
var petPrefab = await AssetProxy.Instance.TryGetAssetAsync<GameObject>(petEntity.petAsset, EntityManager.ASSET_POOL_NAME).Task;
gameObject = Object.Instantiate(petPrefab, petEntity.transform);
gameObject.SetActive(true);
callback?.Invoke();
break;
default:
callback?.Invoke();
break;
}
this.initSuccess = true;
}
public void Disappear()
{
if (gameObject)
gameObject.SetActive(false);
}
public void Appear()
{
if (gameObject)
gameObject.SetActive(true);
}
public void OnUpdate(float deltaTime)
{
}
#endregion
#region IDisposable Support
// 添加此代码以正确实现可处置模式。
public void Dispose()
{
switch (_entity.entityType)
{
case EntityType.Minion:
case EntityType.Boss:
if (gameObject)
{
SpawnPool.Despawn(gameObject);
gameObject = null;
}
break;
default:
break;
}
}
#endregion
}
}