//更新代码-M2NGUIChangecloth_Script.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class M2NGUIChangecloth_Script : MonoBehaviour
{
/*角色换装demo案例
*
* 需求分析:
* · 角色选择
* · 服装选择
* · 武器选择
* · 动画选择
*
* 技术分析:
* · 点击按钮实现切换
* · 按钮功能分为四类,对应上述需求分析
* · 不同功能对应不同美术资源
*
* 问题:
* · 如何管理按钮点击(按钮只负责输入,不负责具体业务处理)
* · 如何组织功能(业务单独处理)
* · 如何管理美术资源在场景中的使用(资源存放,动态加载)
*
* 此脚本是主业务处理主脚本,挂在demo准备的原点空物体上(“characterCreation”)
*
*/
private M2NGUIResourcesLoad_script ResourcesLoad = new M2NGUIResourcesLoad_script();
private Object Character;
private GameObject CharacterGameObj;
private Transform WeaponTF;
private Object Weapon;
//递归返回的Transform组件
private Transform childTF;
private GameObject ClotherTF;
private Texture Clother;
private Object Animation;
private void Start()
{
PlayerPrefs.DeleteKey("Character");
PlayerPrefs.DeleteKey("Weapons");
childTF = null;
}
//更换人物方法
public void ChangeCharacter(string ResourcesName)
{
//查询是否有人物存储,有则销毁,因为是更换另一个人物,所以需要销毁
if (PlayerPrefs.HasKey("Character"))
{
Object.Destroy(this.transform.GetChild(0).gameObject);
//清除人物存储等于初始化人物
PlayerPrefs.DeleteKey("Character");
//清除武器存储等于初始化武器
PlayerPrefs.DeleteKey("Weapons");
}
Character = ResourcesLoad.Characterload(ResourcesName);
CharacterGameObj = (GameObject)Instantiate(Character, this.transform.position, this.transform.rotation, this.transform);
//生成后存储此人物名称
PlayerPrefs.SetString("Character", ResourcesName);
}
//更换武器方法
public void ChangeWeapons(string ResourcesName)
{
//首先判断有没有人物的存储,有则可以生成武器
if (PlayerPrefs.HasKey("Character"))
{
//查询是否有武器存储,有则销毁,因为是更换另一个武器,所以需要销毁
if (PlayerPrefs.HasKey("Weapons"))
{
Object.Destroy(WeaponTF.transform.GetChild(0).gameObject);
PlayerPrefs.DeleteKey("Weapons");
}
//获取武器物体
Weapon = ResourcesLoad.Weaponsload(ResourcesName);
//使用递归查找武器挂载点位置,比直接GameObject.Find性能要好
//WeaponTF = GameObject.Find("wphand");
WeaponTF = GetNameFindGameObject(CharacterGameObj.transform, "wphand");
//生成武器
Instantiate(Weapon, WeaponTF.transform.position, WeaponTF.transform.rotation, WeaponTF.transform);
//生成后存储此武器名称
PlayerPrefs.SetString("Weapons", ResourcesName);
}
else
{
print("对不起,没有生成人物,所以不能生成武器");
}
}
//更换衣服方法
public void ChangeClother(string ResourcesName)
{
//首先判断有没有人物的存储,有则可以生成衣服
if (PlayerPrefs.HasKey("Character"))
{
Clother = ResourcesLoad.Clotherload(PlayerPrefs.GetString("Character","name"),ResourcesName);
ClotherTF = GameObject.Find("mon_"+PlayerPrefs.GetString("Character", "name"));
ClotherTF.GetComponent<Renderer>().material.mainTexture = Clother;
}
else
{
print("对不起,没有生成人物,所以不能生成衣服");
}
}
//更换动画方法
public void ChangeAnimation(string ResourcesName)
{
//首先需要判断角色是否为空
//不为空时才播放ResourcesName动画
if (PlayerPrefs.HasKey("Character"))
{
//播放首选动画,调取人物的Animation组件
CharacterGameObj.GetComponent<Animation>().CrossFade(ResourcesName);
}
else
{
print("没有人物呢,播放不了动画");
}
}
/// <summary>
/// 使用递归获取子物体
/// </summary>
/// <param name="GOTF">父物体的Transform组件</param>
/// <param name="name">需要查找的子物体名称</param>
/// <returns></returns>
public Transform GetNameFindGameObject(Transform GOTF, string name)
{
for (int i = 0; i < GOTF.childCount; i++)
{
//调试行
//print(GOTF.GetChild(i).gameObject.name);
//首先先遍历是否符合条件
if (GOTF.GetChild(i).gameObject.name == name)
{
//print("已经找到了");
childTF = GOTF.GetChild(i);
return childTF;
}
//遍历没有符合的在递归下一层
childTF = GetNameFindGameObject(GOTF.GetChild(i), name);
}
return childTF;
}
}
|