130 lines
4.9 KiB
C#
130 lines
4.9 KiB
C#
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;
|
||
}
|
||
} |