using System; using System.Collections; using System.Collections.Generic; using GameFramework.Event; using UnityEngine; using GameFramework.DataTable; namespace MetaClient { public class CustomManager : MonoBehaviour { public static CustomManager Instance; public RoleCustomData bodyData; public const float valueFloating = 1f; public CustomRoleController testPlayer = null; public Dictionary bones = new Dictionary(); private void Awake() { Instance = this; } public void Init() { GameEntry.Event.Subscribe(CustomRoleBodyEventArgs.EventId, UpdateBody); CreateCustomBodyData(); } /// /// 生成玩家自定义数据信息 /// public void CreateCustomBodyData() { testPlayer = GameObject.Find("6").GetComponent(); bodyData = new RoleCustomData(); //初始化 IDataTable drCB = GameEntry.DataTable.GetDataTable(); DRCustomBody[] dtCB = drCB.GetAllDataRows(); for (int i = 0; i < dtCB.Length; i++) { var partData = new PartData( dtCB[i].Id, dtCB[i].BoneName.Split(','), dtCB[i].ScaleRangeMin, dtCB[i].ScaleRangeMax, dtCB[i].ScaleChange, dtCB[i].PositionChange, dtCB[i].RotationChange, dtCB[i].IsBlend, dtCB[i].BiggerBlendName, dtCB[i].SmallerBlendName, dtCB[i].DefaultBlendValue ); bodyData.bodyList.Add(dtCB[i].Id, partData); } bones.Clear(); foreach (var item in bodyData.bodyList) { var key = item.Key; var value = item.Value; if(!value.useBlend) { for (int i = 0; i < value.bones.Length; i++) { var transform = CustomRoleUtility.GetChild(testPlayer.transform, value.bones[i]); if (!transform) { continue; } if (!bones.ContainsKey(value.bones[i])) { bones.Add(value.bones[i], transform); } } } } Debug.Log( "一共有"+ bones.Count + "部位的骨骼自定义修改"); //获取自定义骨骼的初始数据 foreach (var item in bones) { var key = item.Key; var value = item.Value; bodyData.orginLocalScaleList.Add(key, value.localScale); bodyData.orginChangeScaleList.Add(key, new Vector3(1,1,1)); bodyData.ChangedScaleParamsList.Add(key, new Vector3(1,1,1)); } } public void Clear() { GameEntry.Event.Unsubscribe(CustomRoleBodyEventArgs.EventId, UpdateBody); } private void UpdateBody(object sender, GameEventArgs e) { CustomRoleBodyEventArgs crf = (CustomRoleBodyEventArgs)e; if (crf != null) { //更新数据 var partData = bodyData.bodyList[crf.Part]; if(partData == null) { Debug.LogError("ID :" + crf.Part + " 无数据"); return; } if(partData.useBlend) { ChangeBlendShape(partData, crf.ChangeValue); } else { ChangeBone(partData, crf.ChangeValue); } } } /// /// 变形器改变 /// /// /// private void ChangeBlendShape(PartData partData, Vector3 changeValue) { partData.floatValue = changeValue.x; if(partData.floatValue == 0.5f) { RefreshRoleBlendShape(partData.biggerBlendName, 0); RefreshRoleBlendShape(partData.smallerBlendName, 0); } if(partData.floatValue > 0.5f) { RefreshRoleBlendShape(partData.biggerBlendName, (partData.floatValue - 0.5f) * 2 * 100); RefreshRoleBlendShape(partData.smallerBlendName, 0); } if(partData.floatValue < 0.5f) { RefreshRoleBlendShape(partData.biggerBlendName, 0); RefreshRoleBlendShape(partData.smallerBlendName, (0.5f - partData.floatValue) * 2 * 100); } } /// /// 骨骼改变 /// /// /// private void ChangeBone(PartData partData,Vector3 changeValue) { if (changeValue.x == 0.5f) { partData.floatValue = 1; } if (changeValue.x < 0.5f) { partData.floatValue = partData.minChangeValue + (1 - partData.minChangeValue) * (changeValue.x / 0.5f); } if (changeValue.x > 0.5f) { partData.floatValue = 1 + (partData.maxChangeValue - 1) * ((changeValue.x - 0.5f) / 0.5f); } Debug.Log(partData.id + " : " + changeValue + " 转换后 :" + partData.floatValue); if (partData.scaleChange != Vector3.zero) { for (int i = 0; i < partData.bones.Length; i++) { //var orginBoneScale = bodyData.orginWorldScaleList[partData.bones[i]]; var orginBoneScale = bodyData.orginLocalScaleList[partData.bones[i]]; var changeScale = bodyData.orginChangeScaleList[partData.bones[i]]; var bone = bones[partData.bones[i]]; var nowBone = bones[partData.bones[i]]; //var scale = nowBone.lossyScale; var scale = nowBone.localScale; var nowScale = new Vector3(scale.x / orginBoneScale.x, scale.y / orginBoneScale.y, scale.z / orginBoneScale.z); //var newBoneScale = new Vector3(orginBoneScale.x * (partData.scaleChange.x == 1 ? partData.floatValue : 1) * nowScale.x, orginBoneScale.y * (partData.scaleChange.y == 1 ? partData.floatValue : 1) * nowScale.y, orginBoneScale.z * (partData.scaleChange.z == 1 ? partData.floatValue : 1) * nowScale.y); var newBoneScale = new Vector3( partData.scaleChange.x == 1 ? partData.floatValue * orginBoneScale.x * changeScale.x : scale.x, partData.scaleChange.y == 1 ? partData.floatValue * orginBoneScale.y * changeScale.y : scale.y, partData.scaleChange.z == 1 ? partData.floatValue * orginBoneScale.z * changeScale.z : scale.z ); bodyData.changedScaleList[partData.bones[i]] = newBoneScale; bodyData.ChangedScaleParamsList[partData.bones[i]] = new Vector3(newBoneScale.x/orginBoneScale.x/changeScale.x, newBoneScale.y / orginBoneScale.y / changeScale.y, newBoneScale.z / orginBoneScale.z / changeScale.z); Debug.Log(partData.bones[i] + " : " + bodyData.ChangedScaleParamsList[partData.bones[i]]); //子物体 var count = nowBone.childCount; for (int j = 0; j < count; j++) { var childname = nowBone.GetChild(j).name; if(bones.ContainsKey(childname)) { var orginChildBoneScale = bodyData.orginLocalScaleList[childname]; var beforeChildScaleParams = bodyData.ChangedScaleParamsList[childname]; bodyData.orginChangeScaleList[childname] = new Vector3(orginBoneScale.x/newBoneScale.x, orginBoneScale.y / newBoneScale.y, orginBoneScale.z / newBoneScale.z); bodyData.changedScaleList[childname] = new Vector3( beforeChildScaleParams.x * bodyData.orginChangeScaleList[childname].x * orginChildBoneScale.x, beforeChildScaleParams.y * bodyData.orginChangeScaleList[childname].y * orginChildBoneScale.y, beforeChildScaleParams.z * bodyData.orginChangeScaleList[childname].z * orginChildBoneScale.z ); Debug.Log(childname + " : " + bodyData.ChangedScaleParamsList[childname]); } } } } RefreshRoleBone(); } public float GetBodyBoneValue(int id) { var partData = bodyData.bodyList[id]; if(partData.useBlend) { return partData.floatValue; } Debug.Log(id +": GetBodyBoneValue + " + partData.scaleChange + " " + partData.floatValue); if (partData.scaleChange.x == 1 || partData.scaleChange.y == 1 || partData.scaleChange.z == 1) { if (partData.floatValue == 1) { return 0.5f; } if (partData.floatValue < 1) { return (partData.floatValue - partData.minChangeValue) / (1 - partData.minChangeValue)/2; } if (partData.floatValue > 1) { return 0.5f + (partData.floatValue - 1) / (partData.maxChangeValue - 1)/2; } } return 0.5f; } /// /// 重置角色数据 /// public void ResetRole() { if(testPlayer == null) { Debug.LogError("没有模型存在"); return; } Debug.Log("重置模型"); foreach (var item in bodyData.bodyList) { var key = item.Key; var value = item.Value; if(value.useBlend) { value.floatValue = 0; } else { value.floatValue = 1; } } //重置缩放 foreach (var item in bodyData.orginLocalScaleList) { var key = item.Key; var value = item.Value; testPlayer.SetBoneScale(key, value); //testPlayer.SetBoneWorldScale(key, value); if (bodyData.changedScaleList.ContainsKey(key)) { bodyData.changedScaleList[key] = bodyData.orginLocalScaleList[key]; } bodyData.orginChangeScaleList[key] = new Vector3(1, 1, 1); bodyData.ChangedScaleParamsList[key] = new Vector3(1, 1, 1); } //重置旋转 foreach (var item in bodyData.orginLocalRotationList) { var key = item.Key; var value = item.Value; testPlayer.SetBoneRot(key, value); } //重置位置 foreach (var item in bodyData.orginLocalPositionList) { var key = item.Key; var value = item.Value; testPlayer.SetBonePos(key, value); } testPlayer.ResetAllBlendShape(); } public void RefreshRoleBlendShape(string name,float value) { if (testPlayer == null) { Debug.LogError("没有模型存在"); return; } testPlayer.SetBlendShape(name, value); } public void RefreshRoleBone() { if (testPlayer == null) { Debug.LogError("没有模型存在"); return; } Debug.Log("刷新模型"); //刷新缩放 //foreach (var item in bodyData.orginLocalScaleList) //{ // var key = item.Key; // var value = item.Value; // if(bodyData.changedScaleList.ContainsKey(key)) // { // testPlayer.SetBoneScale(key, bodyData.changedScaleList[key]); // } // else // { // testPlayer.SetBoneScale(key, value); // } //} foreach (var item in bodyData.changedScaleList) { var key = item.Key; var value = item.Value; //testPlayer.SetBoneWorldScale(key, value, bodyData.orginLocalScaleList[key], bodyData.orginWorldScaleList[key]); testPlayer.SetBoneScale(key, value); } } /// /// 旋转模特 /// public void RotateModel(float offset) { if (testPlayer == null) { Debug.LogError("没有模型存在"); return; } testPlayer.RotateSelf(offset); } } }