四个类完成,前提是 资源得名字配合

UI按钮点击响应类

using UnityEngine;
using System.Collections; public class ButtonClickHandler : MonoBehaviour {
//处理业务控制类
private SkinController skinController = null; //按钮执行相应业务得向导
public void OnButtonClickWizard()
{
var arr= UIButton.current.name.Split(' ');
var function = arr[0];
var goName=arr[1];
switch (function)
{
case "Character":
skinController.ChangeCharacter(goName);
break;
case "Clother":
skinController.ChangeClother(goName);
break;
case "Weapons":
skinController.ChangeWeapons(goName);
break;
case "Animation":
skinController.ChangeAnimation(goName);
break;
}
}
/// <summary>
/// 初始化为所有Button注册点击后得响应方法
/// </summary>
void Start () {
skinController = FindObjectOfType<SkinController>();
for (int i = 0; i < transform.childCount; i++)
{
transform.GetChild(i).GetComponent<UIButton>().onClick.Add(new EventDelegate(OnButtonClickWizard));//NGUI
}
} }

  加载资源工厂类

using UnityEngine;
using System.Collections.Generic; /// <summary>
/// 创建动态加载资源
/// </summary>
public class CharacterFactory {
//各类资源得位置
private string CharacterPath = "Prefabs/mon_";
private string ClotherPath = "Clother/";
private string WeaponPath = "Weapon/wp_";
//资源对象内存缓存
private Dictionary<string, Object> GoCache; private static CharacterFactory instance;
public static CharacterFactory Instance
{
get
{
if(instance==null)
instance = new CharacterFactory();
return instance;
}
} public CharacterFactory()
{
GoCache = new Dictionary<string, Object>();
}
public GameObject CreateCharacter(string characterName)
{
return LoadResource<GameObject>(CharacterPath+ characterName);
}
public GameObject CreateWeapon(string weaponName)
{
return LoadResource<GameObject>(WeaponPath + weaponName);
}
public Texture CreateClother(string clotherName)
{
return LoadResource<Texture>(ClotherPath + clotherName);
} private T LoadResource<T>(string resourceName)
where T :Object
{
//检测是否已创建该资源
if(GoCache.ContainsKey(resourceName))
{
T go = (T)Resources.Load(resourceName); if(!(go is Texture))//如果不是贴图就运行下面
{
go = (T)GameObject.Instantiate(go);
go.name = go.name.Replace("(Clone)", "");
GoCache.Add(resourceName, go);
}
}
//有直接返回
return (T)GoCache[resourceName];
}
}

  业务处理控制类

using UnityEngine;
using System.Collections;
using System; /// <summary>
/// 业务处理控制类
/// </summary>
public class SkinController : MonoBehaviour { public GameObject currentCharacter = null;
public GameObject currentWeapon = null; /// <summary>
/// 换角色
/// </summary>
/// <param name="goName"></param>
public void ChangeCharacter(string goName)
{
var character = CharacterFactory.Instance.CreateCharacter(goName);
//判断当前角色是否为空, 或当前角色已展示
if (currentCharacter != null && currentCharacter.name != character.name)
currentCharacter.SetActive(false);
character.transform.position = transform.position;
character.transform.rotation = transform.rotation;
this.currentCharacter = character;
this.currentCharacter.SetActive(true);
}
/// <summary>
/// 换服装
/// </summary>
/// <param name="goName"></param>
public void ChangeClother(string goName)
{
if(currentCharacter!=null)
{
var clother= CharacterFactory.Instance.CreateClother(currentCharacter.name+"_"+goName);
var chName = currentCharacter.name;
currentCharacter.transform.FindChild(chName).GetComponent<Renderer>().material.mainTexture = clother;
}
}
/// <summary>
/// 换武器
/// </summary>
/// <param name="goName"></param>
public void ChangeWeapons(string goName)
{
if (currentCharacter != null)
{
var weapon = CharacterFactory.Instance.CreateWeapon(goName);
if (currentWeapon != null && currentWeapon.name != weapon.name)
currentWeapon.SetActive(false);
GameObject wpHand = GlobalTool.FindChild(currentCharacter.transform, "wphand"); currentWeapon = weapon;
currentWeapon.transform.parent = wpHand.transform;
currentWeapon.transform.position = wpHand.transform.position;
currentWeapon.transform.rotation = wpHand.transform.rotation;
currentWeapon.transform.localScale = new Vector3(1, 1, 1);
currentWeapon.SetActive(true);
} }
/// <summary>
/// 播放动画
/// </summary>
/// <param name="goName"></param>
public void ChangeAnimation(string goName)
{ currentCharacter.GetComponent<Animation>().Play(goName);
}
}

  查找角色上子物体优化算法类

using UnityEngine;
using System.Collections; public class GlobalTool { public static GameObject FindChild(Transform trans,string goName)
{
var child=trans.FindChild(goName);
if(child!= null)
return child.gameObject;
GameObject go = null;
for (int i = 0; i < trans.childCount; i++)
{
child= trans.GetChild(i);
go= FindChild(child, goName);
if(go!=null)
{
return go;
}
}
return null;
}
}

  

U3D简单得换装技术的更多相关文章

  1. 浅谈角色换装功能--Unity简单例子实现

    在前置篇中,基本上梳理了一下换装功能背后涉及到的美术工作流.但程序员嘛,功能终归是要落到代码上的.本文中会结合Unity提供的API及之前提到的内容来实现一个简单的换装功能.效果如下: (图1:最终效 ...

  2. DragonBones龙骨换装(局部换装+全局换装)

    参考: Egret官方换装动画 Egret换装三种方式 CSDN(全局换装) egret使用DragonBones实现简单的换装 换装,主要是替换任意插槽的图片,来达到局部换装的目的. 游戏中可以只制 ...

  3. cocos2d下,优秀骨骼spine的换装思路

    语文老师说,文章要有个好开头!!! 最近正在引入spine骨骼代替dragon bone骨骼,既然要替代,那么原先在dragon bone上的一些额外需求,不管dragon bone上能不能实现,都应 ...

  4. Unity动态换装之Spine换装

    注:转载请注明转载,并附原链接 http://www.cnblogs.com/liaoguipeng/p/5867510.html 燕双飞情侣 一.动态换装原理 换装,无非就是对模型的网格,或者贴图进 ...

  5. 【AS3 Coder】任务六:人物换装(纸娃娃)系统的制作

    使用框架:AS3(Flash Professional CS5.0及更高版本 + Flash Buider)任务描述:了解人物换装系统的制作原理难度系数:2 本章源码下载:http://www.iam ...

  6. 『HTML5梦幻之旅』 - 仿Qt演示样例Drag and Drop Robot(换装机器人)

    起源 在Qt的演示样例中看到了一个有趣的demo.截图例如以下: 这个demo的名字叫Drag and Drop Robot,简单概括而言,在这个demo中,能够把机器人四周的颜色拖动到机器人的各个部 ...

  7. 【Unity3D】3D角色换装++ Advance

    http://www.cnblogs.com/dosomething/archive/2012/12/15/2818897.html 本文在之前的文章Unity3D角色换装的原理 基础上做一个补充 给 ...

  8. 3D游戏中人物换装解决方案

    换装基本上是每个网游都必须有的一个功能,每种网游的做法都各有不同,有些是换掉整个模型,有些则是通过可以换掉模型的一个部分完成.前者属于整体换,相对简单些:后者则是通过部分替换实现,目前用的比较多,本文 ...

  9. Blender建模与游戏换装(转载文)

    本文转载自https://my.oschina.net/huliqing/blog/880113?hmsr=toutiao.io 如果本文涉及侵权行为,请原作者联系博主邮箱,我将及时进行删除处理 博主 ...

随机推荐

  1. 在SQL Server 2008中调用.net,dll

    原文:在SQL Server 2008中调用.net,dll T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQ ...

  2. Roslyn 编译平台概述

    在Language Feature Status上面看到,其实更新的并不是特别多,为了不会误导看了C# 6.0 功能预览 (一)的园友,现在把官方的更新列表拿了过来,供大家参考 C# 6.0 功能预览 ...

  3. 青铜器RDM全面支持CMMI、GJB5000A L2~L5认证评估

    青铜器RDM全面实现对CMMI L4.GJB5000A L4的100%支持,并且已经成为众多组织CMMI.GJB5000A落地执行的有效手段,避免认证与执行2张皮,有利于体系的贯彻执行,以下是青铜器R ...

  4. Windows Server 服务器安全配置

    Windows Server 服务器安全配置 好吧,我标题党了.我只了解一些基本的安全配置.如果你是大湿,请绕道或者给予我严厉的批评让我进步谢谢. 编辑这篇文章用的编辑器编辑的,当我单击查看的时候发现 ...

  5. Django部署到Apache Web Server

    Windows环境下,将Django部署到Apache Web Server 在Windows上部署Django(用mod_wsgi)会出现各种奇怪的问题,现简单记录下配置过程及遇到的错误及解决方法. ...

  6. Dynamics CRM 警惕Odata查询的陷阱

    Dynamics CRM可以很方便的通过用Odata通过AJAX查询到数据.查询分为两种:精确查找和模糊查找. 精确查找是指通过GUID匹配得到一条数据,如: http://CRMURL/org/XR ...

  7. 职责链模式实例(C#)

    下面是使用指责链模式的一个具体的实例,可以方便的理解指责链模式. 其实指责链简单的来说,就是把一个指责的流程定义出来,像一条链路一样,每一个结点有自己的处理范围,若不能处理,则传到自己的引用的下一个结 ...

  8. 一个Shell小脚本——旋转的斜杠

    话不多说,请从代码中寻找乐趣吧! #!/bin/bash #----中断计数器----# incr= #----旋转的斜杠----# spin="/-\|" echo -en &q ...

  9. Asp.net mvc 大文件上传 断点续传

    Asp.net mvc 大文件上传 断点续传 进度条   概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...

  10. Discuz! X2.5数据库字典(转)

    DROP TABLE IF EXISTS pre_common_admincp_cmenu; CREATE TABLE pre_common_admincp_cmenu ( `id` SMALLINT ...