using Metaverse; using System; using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using UnityEngine; //using System.Text.RegularExpressions; public class Boys : MonoBehaviour { #region 基础参数 /// /// 姓名 /// public string name; /// /// 性别 /// public bool gender; /// /// 年龄 /// public int Age; /// /// 肤色 /// public string colourOfSkin; /// /// 体型 /// //public int shape; /// /// 音量 /// public float volume; public Dictionary audios_library = new Dictionary(); #endregion #region 面部表情参数 [SerializeField] Animator an;//动画机 [SerializeField] int min;//最小值 [SerializeField] int max;//最大值 [SerializeField] SkinnedMeshRenderer skinnedMeshRenderer;//面部表情的组件 #endregion #region 换装参数 [SerializeField] private AvatarOutlookDataConfig outlookConfig;//上衣参数 [SerializeField] private AvatarHairDataConfig hairConfig;//头发 [SerializeField] private AvatarGlassesDataConfig glassesConfig;//眼镜装饰 [SerializeField] private AvatarBeardDataConfig beardConfig;//胡子 [SerializeField] private SkinnedMeshRenderer head, body, top, bottom, footwear, hair, glasses, beard; private Material currentHeadMat; private Material cacheHeadMat; [SerializeField] private SkinnedMeshRenderer headwuman, bodywuman, topwuman, bottomwuman, footwearwuman, hairwuman, glasseswuman, beardwuman; [SerializeField] private SkinnedMeshRenderer headman, bodyman, topman, bottomman, footwearman, hairman, glassesman, beardman; #endregion public static Boys ins; [SerializeField] AudioSource au; [SerializeField] string str; [SerializeField] bool isok = false; [SerializeField] int indexs; [SerializeField] float clipCount; [SerializeField] List strings; [SerializeField] List Tempstrings; [SerializeField] List cliplenth; [SerializeField] TextToSpeechHuman textTo; [SerializeField] string[] outManlookConfigStr; [SerializeField] string[] outWuManlookConfigStr; Regex regex = new Regex("\\$(.*?)\\$"); public void Awake() { ins = this; AudiosLibrary tempau = new AudiosLibrary(); tempau.AudiosMan = "x4_lingfeichen_assist"; tempau.AudiosVolume = 100; tempau.AudiosHigth = 10; tempau.AudiosSpeed = 50; audios_library.Add("重音", tempau); } private void Start() { //BodyShow("敬礼"); } /// /// 处理字符串,提取出$$中的字符并删除 /// /// /// public string showStr(string str) { strings = new List(); this.str = str; MatchCollection matches = regex.Matches(str); foreach (Match match in matches) { string result = match.Groups[1].Value; string replaced = result.Replace("$", ""); strings.Add(replaced); } return RemoveDollarSignsAndReplaceNewlines(str); } /// /// 处理字符串中的$$和$$中的字符 /// /// /// string RemoveDollarSignsAndReplaceNewlines(string input) { Tempstrings = new List(); Regex regex = new Regex("\\$(.*?)\\$"); var temp = regex.Split(input); string tempstrs = ""; for (int i = 0; i < temp.Length; i++) { if (i % 2 == 0) { tempstrs += temp[i]; Tempstrings.Add(temp[i]); } } return tempstrs; } public void showClips(float sum) { int sumint = 0; cliplenth = new List(); clipCount = str.Length / sum; for (int i = 0; i < Tempstrings.Count; i++) { sumint += Tempstrings[i].Length; cliplenth.Add((sumint / 5 /*(int)Math.Round(clipCount, MidpointRounding.AwayFromZero)*/) + 6); } isok = true; } int haircount = 0; int biaoqinqcoount = 6; private void Update() { //换装 if (Input.GetKeyDown(KeyCode.Q)) { indexs++; if (indexs > 14) indexs = 0; Replacement(indexs); } //发型 if (Input.GetKeyDown(KeyCode.W)) { haircount++; if (haircount > 4) haircount = 0; ChangingHair(haircount); } if (Input.GetKeyDown(KeyCode.E)) { biaoqinqcoount++; if (biaoqinqcoount > 15) biaoqinqcoount = 6; Show(biaoqinqcoount); } //if (Input.GetKeyDown(KeyCode.E)) //{ // indexs++; //} if (Input.GetKeyDown(KeyCode.S)) { show(false); } if (strings.Count != 0) { isok = true; } else { isok = false; } if (isok) { if ((int)au.time == cliplenth[0]) { switch (strings[0]) { case "摇头": headShow("摇头"); break; case "左偏头": headShow("左偏头"); break; case "侧头": headShow("侧头"); break; case "右偏头": headShow("右偏头"); break; case "点头": headShow("点头"); break; case "敬礼": BodyShow("敬礼"); break; case "拳击": BodyShow("拳击"); break; case "鼓掌": BodyShow("鼓掌"); break; case "鞠躬": legShow("鞠躬"); break; case "跪下": legShow("跪下"); break; case "后仰": legShow("后仰"); break; case "跳跃": legShow("跳跃"); break; default: Debug.Log("动画库中没有该名字:" + strings[0]); break; } strings.RemoveAt(0); cliplenth.RemoveAt(0); } Debug.Log((int)au.time); } } /// /// 改变说话音量 /// /// public void SetVolume(int sum = 100) { textTo.volume = sum; } /// /// 读取男性已有衣服列表 /// /// public string[] GetManOutlookConfig() { return outManlookConfigStr.Length == 0 ? null : outManlookConfigStr; } /// /// 读取女性已有衣服列表 /// /// public string[] GetWuManOutlookConfig() { return outWuManlookConfigStr.Length == 0 ? null : outWuManlookConfigStr; } /// /// true是男,false是女 /// /// private void show(bool man) { if (man) { head = headman; body = bodyman; top = topman; bottom = bottomman; footwear = footwearman; hair = hairman; glasses = glassesman; } else { head = headwuman; body = bodywuman; top = topwuman; bottom = bottomwuman; footwear = footwearwuman; hair = hairwuman; glasses = glasseswuman; } } #region 动画 /// /// 头动画(摇头、左摇头、侧头、右偏头、点头) /// /// public void headShow(string name, int index = 1) { //an.SetFloat("head1", index); an.Play(name, index, 0); } /// /// 手动画(敬礼、拳击、鼓掌) /// /// public void BodyShow(string name, int index = 2) { an.Play(name, index, 0); } /// /// 腿动画+身体动画(鞠躬、跪下、后仰、跳跃) /// /// public void legShow(string name, int index = 3) { an.Play(name, index, 0); } #endregion #region 面部表情 /// /// 面部表情(6-15) /// /// public void Show(int index) { int temp = Math.Clamp(index, 6, 15); StopCoroutine(init(temp)); StartCoroutine(init(temp)); } IEnumerator init(int index) { for (int i = min; i < max; i++) { skinnedMeshRenderer.SetBlendShapeWeight(i, 0); } yield return new WaitForSeconds(0.1f); for (int i = 30; i < 101; i++) { yield return new WaitForSeconds(0.01f); skinnedMeshRenderer.SetBlendShapeWeight(index, i); } } #endregion #region 换装部分 /// /// 换衣服(范围0-14) /// /// public void Replacement(int index1 = 0) { int temp = Math.Clamp(index1, 0, 14); int index = temp; head.sharedMesh = outlookConfig.data[index].headMesh; head.sharedMaterial = currentHeadMat != null ? currentHeadMat : outlookConfig.data[index].headMaterial; cacheHeadMat = outlookConfig.data[index].headMaterial; body.sharedMesh = outlookConfig.data[index].bodyMesh; body.sharedMaterial = outlookConfig.data[index].bodyMaterial; top.sharedMesh = outlookConfig.data[index].topMesh; top.sharedMaterial = outlookConfig.data[index].topMaterial; bottom.sharedMesh = outlookConfig.data[index].bottomMesh; bottom.sharedMaterial = outlookConfig.data[index].bottomMaterial; footwear.sharedMesh = outlookConfig.data[index].footwearMesh; footwear.sharedMaterial = outlookConfig.data[index].footwearMaterial; } /// /// 换头发(范围0-4) /// /// public void ChangingHair(int index1 = 0) { int temp = Math.Clamp(index1, 0, 4); int index = temp; hair.sharedMesh = hairConfig.data[index].hairMesh; hair.sharedMaterial = hairConfig.data[index].hairMaterial; } /// /// 换眼镜(范围0-5) /// /// public void ChangeGlasses(int index1 = 0) { int temp = Math.Clamp(index1, 0, 5); int index = temp; glasses.sharedMesh = glassesConfig.data[index].glassesMesh; glasses.sharedMaterial = glassesConfig.data[index].glassesMaterial; } /// /// 换脸(范围0-4) /// /// public void faceTransplant(int index1) { int temp = Math.Clamp(index1, 0, 4); int index = temp; var data = beardConfig.data[index]; Debug.Log(data.type); switch (data.type) { case AvatarBeardData.Type.Mesh: beard.sharedMesh = beardConfig.data[index].beardMesh; beard.sharedMaterial = beardConfig.data[index].beardMaterial; currentHeadMat = null; if (cacheHeadMat != null) head.sharedMaterial = cacheHeadMat; break; case AvatarBeardData.Type.Texture: head.sharedMaterial = beardConfig.data[index].beardMaterial; currentHeadMat = beardConfig.data[index].beardMaterial; beard.sharedMesh = null; beard.sharedMaterial = null; break; } } #endregion }