Files
JJBB/Assets/Project/Script/Obj/Obj_Characters/Obj_CharacterClone.cs

130 lines
4.9 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using System.Collections;
using Games.GlobeDefine;
using GCGame.Table;
using UnityEngine;
namespace Games.LogicObj
{
public class Obj_Character_Clone_Init_Data : Obj_Character_Init_Data
{
public Material[] addMaterials;
public CharacterCloneAnimData animData;
public Material baseMaterial;
}
/// <summary>
/// 角色在世界空间的克隆体
/// </summary>
// 主要用于构造角色之后,需要同时修改材质或者其他显示效果的情况
// 仅角色自己可以很容易收获模型加载完成的消息,因此单独开辟一个类
public class Obj_CharacterClone : Obj_Character
{
/// 角色动画需求数据 - 用于处理模型延迟加载的问题
public CharacterCloneAnimData AnimData { get; private set; }
public override bool Init(ObjParent_Init_Data initData1)
{
var result = false;
var initData = initData1 as Obj_Character_Clone_Init_Data;
if (initData != null)
{
ModelID = initData.m_ModelVisualID;
ModelVisualID = initData.m_ModelVisualID;
WeaponDataID = initData.m_WeaponDataID;
WeaponEffectGem = initData.m_WeaponEffectGem;
WingModelAuraid = initData.m_WingAuraId;
EffectAuraId = initData.m_EffectAuraId;
Profession = initData.m_nProfession;
AdvanceWingId = initData.m_AdvanceWingId;
InitMaterialManager();
ClearMaterialMods();
AddMaterialToBodyPart(initData.baseMaterial, initData.addMaterials, ModelPart.body);
AddMaterialToBodyPart(initData.baseMaterial, initData.addMaterials, ModelPart.weaponLeft);
AddMaterialToBodyPart(initData.baseMaterial, initData.addMaterials, ModelPart.weaponRight);
AnimData = initData.animData;
//SetAnim();
if (Profession >= 0)
{
var itemVisual = TableManager.GetItemVisualByID(ModelVisualID, 0);
if (itemVisual == null)
{
ModelVisualID = GlobeVar.DEFAULT_VISUAL_ID;
itemVisual = TableManager.GetItemVisualByID(ModelVisualID, 0);
}
ModelID = GetCharModelID(itemVisual, Profession);
}
var charModel = TableManager.GetCharModelByID(ModelID, 0);
if (charModel != null)
{
result = true;
transform.localScale = Vector3.one * charModel.Scale;
CreateModel(ModelID);
}
}
return result;
}
public override void CreateModel(int modelId, string resPath, string bundlePath, Hashtable table = null,
ObjModelLoadCallback delFinish = null)
{
// Prevent Blinking on reuse.
if (ModelNode.model != null && (ModelNode.targetBundle != bundlePath || ModelNode.targetModel != resPath))
ModelNode.RemoveModel();
base.CreateModel(modelId, resPath, bundlePath, table, delFinish);
}
private void SetAnim()
{
if (ModelNode.model != null)
{
// 注这个流程无法使用AnimLogic执行 - AnimLogic不支持normalizedTime功能。
var animator = ModelNode.model.GetComponentInChildren<Animator>();
if (animator != null)
if (AnimData == null)
animator.speed = 0f;
else
{
animator.enabled = true;
animator.Play(AnimData.animName, 0, AnimData.normalizedTime);
animator.speed = AnimData.animSpeed;
}
}
}
protected override void CreateModelOver(Hashtable hashParam)
{
base.CreateModelOver(hashParam);
SetAnim();
RealoadPlayerWeaponVisual();
ReloadPlayerEffect();
}
private void AddMaterialToBodyPart(Material baseMaterial, Material[] addMaterials, int modelPart)
{
if (addMaterials != null)
for (var i = 0; i < addMaterials.Length; i++)
AddMaterial(addMaterials[i], modelPart);
if (baseMaterial != null)
CreateMaterialMod(baseMaterial, modelPart);
}
//protected override void CreateBlackModelOver(Hashtable hashParam)
//{
// base.CreateBlackModelOver(hashParam);
// RealoadWingModel((int)hashParam["wingId"], 0);
//}
}
/// <summary>
/// 角色克隆体动画数据
/// </summary>
public class CharacterCloneAnimData
{
public string animName;
public float animSpeed = 1f;
public float normalizedTime;
}
}