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; } /// /// 角色在世界空间的克隆体 /// // 主要用于构造角色之后,需要同时修改材质或者其他显示效果的情况 // 仅角色自己可以很容易收获模型加载完成的消息,因此单独开辟一个类 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(); 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); //} } /// /// 角色克隆体动画数据 /// public class CharacterCloneAnimData { public string animName; public float animSpeed = 1f; public float normalizedTime; } }