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

UI按钮点击响应类

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class ButtonClickHandler : MonoBehaviour {
  5. //处理业务控制类
  6. private SkinController skinController = null;
  7.  
  8. //按钮执行相应业务得向导
  9. public void OnButtonClickWizard()
  10. {
  11. var arr= UIButton.current.name.Split(' ');
  12. var function = arr[0];
  13. var goName=arr[1];
  14. switch (function)
  15. {
  16. case "Character":
  17. skinController.ChangeCharacter(goName);
  18. break;
  19. case "Clother":
  20. skinController.ChangeClother(goName);
  21. break;
  22. case "Weapons":
  23. skinController.ChangeWeapons(goName);
  24. break;
  25. case "Animation":
  26. skinController.ChangeAnimation(goName);
  27. break;
  28. }
  29. }
  30. /// <summary>
  31. /// 初始化为所有Button注册点击后得响应方法
  32. /// </summary>
  33. void Start () {
  34. skinController = FindObjectOfType<SkinController>();
  35. for (int i = 0; i < transform.childCount; i++)
  36. {
  37. transform.GetChild(i).GetComponent<UIButton>().onClick.Add(new EventDelegate(OnButtonClickWizard));//NGUI
  38. }
  39. }
  40.  
  41. }

  加载资源工厂类

  1. using UnityEngine;
  2. using System.Collections.Generic;
  3.  
  4. /// <summary>
  5. /// 创建动态加载资源
  6. /// </summary>
  7. public class CharacterFactory {
  8. //各类资源得位置
  9. private string CharacterPath = "Prefabs/mon_";
  10. private string ClotherPath = "Clother/";
  11. private string WeaponPath = "Weapon/wp_";
  12. //资源对象内存缓存
  13. private Dictionary<string, Object> GoCache;
  14.  
  15. private static CharacterFactory instance;
  16. public static CharacterFactory Instance
  17. {
  18. get
  19. {
  20. if(instance==null)
  21. instance = new CharacterFactory();
  22. return instance;
  23. }
  24. }
  25.  
  26. public CharacterFactory()
  27. {
  28. GoCache = new Dictionary<string, Object>();
  29. }
  30. public GameObject CreateCharacter(string characterName)
  31. {
  32. return LoadResource<GameObject>(CharacterPath+ characterName);
  33. }
  34. public GameObject CreateWeapon(string weaponName)
  35. {
  36. return LoadResource<GameObject>(WeaponPath + weaponName);
  37. }
  38. public Texture CreateClother(string clotherName)
  39. {
  40. return LoadResource<Texture>(ClotherPath + clotherName);
  41. }
  42.  
  43. private T LoadResource<T>(string resourceName)
  44. where T :Object
  45. {
  46. //检测是否已创建该资源
  47. if(GoCache.ContainsKey(resourceName))
  48. {
  49. T go = (T)Resources.Load(resourceName);
  50.  
  51. if(!(go is Texture))//如果不是贴图就运行下面
  52. {
  53. go = (T)GameObject.Instantiate(go);
  54. go.name = go.name.Replace("(Clone)", "");
  55. GoCache.Add(resourceName, go);
  56. }
  57. }
  58. //有直接返回
  59. return (T)GoCache[resourceName];
  60. }
  61. }

  业务处理控制类

  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4.  
  5. /// <summary>
  6. /// 业务处理控制类
  7. /// </summary>
  8. public class SkinController : MonoBehaviour {
  9.  
  10. public GameObject currentCharacter = null;
  11. public GameObject currentWeapon = null;
  12.  
  13. /// <summary>
  14. /// 换角色
  15. /// </summary>
  16. /// <param name="goName"></param>
  17. public void ChangeCharacter(string goName)
  18. {
  19. var character = CharacterFactory.Instance.CreateCharacter(goName);
  20. //判断当前角色是否为空, 或当前角色已展示
  21. if (currentCharacter != null && currentCharacter.name != character.name)
  22. currentCharacter.SetActive(false);
  23. character.transform.position = transform.position;
  24. character.transform.rotation = transform.rotation;
  25. this.currentCharacter = character;
  26. this.currentCharacter.SetActive(true);
  27. }
  28. /// <summary>
  29. /// 换服装
  30. /// </summary>
  31. /// <param name="goName"></param>
  32. public void ChangeClother(string goName)
  33. {
  34. if(currentCharacter!=null)
  35. {
  36. var clother= CharacterFactory.Instance.CreateClother(currentCharacter.name+"_"+goName);
  37. var chName = currentCharacter.name;
  38. currentCharacter.transform.FindChild(chName).GetComponent<Renderer>().material.mainTexture = clother;
  39. }
  40. }
  41. /// <summary>
  42. /// 换武器
  43. /// </summary>
  44. /// <param name="goName"></param>
  45. public void ChangeWeapons(string goName)
  46. {
  47. if (currentCharacter != null)
  48. {
  49. var weapon = CharacterFactory.Instance.CreateWeapon(goName);
  50. if (currentWeapon != null && currentWeapon.name != weapon.name)
  51. currentWeapon.SetActive(false);
  52. GameObject wpHand = GlobalTool.FindChild(currentCharacter.transform, "wphand");
  53.  
  54. currentWeapon = weapon;
  55. currentWeapon.transform.parent = wpHand.transform;
  56. currentWeapon.transform.position = wpHand.transform.position;
  57. currentWeapon.transform.rotation = wpHand.transform.rotation;
  58. currentWeapon.transform.localScale = new Vector3(1, 1, 1);
  59. currentWeapon.SetActive(true);
  60. }
  61.  
  62. }
  63. /// <summary>
  64. /// 播放动画
  65. /// </summary>
  66. /// <param name="goName"></param>
  67. public void ChangeAnimation(string goName)
  68. { currentCharacter.GetComponent<Animation>().Play(goName);
  69. }
  70. }

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

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class GlobalTool {
  5.  
  6. public static GameObject FindChild(Transform trans,string goName)
  7. {
  8. var child=trans.FindChild(goName);
  9. if(child!= null)
  10. return child.gameObject;
  11. GameObject go = null;
  12. for (int i = 0; i < trans.childCount; i++)
  13. {
  14. child= trans.GetChild(i);
  15. go= FindChild(child, goName);
  16. if(go!=null)
  17. {
  18. return go;
  19. }
  20. }
  21. return null;
  22. }
  23. }

  

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. 【SSRS】入门篇(四) -- 向报表添加数据

    原文:[SSRS]入门篇(四) -- 向报表添加数据 定义好数据集后 [SSRS]入门篇(三) -- 为报表定义数据集 ,就可以开始设计报表了,将要显示在报表的字段.文本框.图像和其他项从工具箱拖放到 ...

  2. 如何配置Spring的XML文件及使用

    App.config <?xml version="1.0" encoding="utf-8" ?> <configuration> & ...

  3. WebService使用DataSetSurrogate压缩Dataset的序列化和解压反序列化传输 (转)

    转自:http://blog.163.com/hehong0925@126/blog/static/1339333372012102242920521/ 在WebService中将dataset序列化 ...

  4. bitnami redmine安装、配置、备份、恢复(这篇文章靠谱)

    bitnami redmine安装.配置.备份.恢复 2012-12-17 12:33 2596人阅读 评论(0) 收藏 举报 1. 安装时语言选择英文,不可以选择中文,否则不能正常运行,可以在账户里 ...

  5. 简话ASP.NET Web API

    简话ASP.NET Web API 在vs2012中,我们很容易在根据选择的ASP.NET MVC Web应用程序来新建一个Web API应用,聪明的你一定想见得到,Web API和MVC有着某种联系 ...

  6. 给Angularjs配上Requirejs

    给Angularjs配上Requirejs 需要考虑的事情: 1.js.css.template都按需加载,js主要就controller: * js和css都可以用requirejs和它的插件解决, ...

  7. C#控件怎样获取,和失去焦点的处理

    publicForm1() { InitializeComponent(); textBox1.Enter+=newEventHandler(textBox1_Enter);//获得焦点事件 text ...

  8. discuz 门户功能增加自定义keywords字段

    discuz的门户的“发布文章”功能中,没有自动添加keywords字段,结果在文章页面中的meta的keywords中只显示标题,这样对于seo及其不利,今天整理了添加keywords字段方法. 一 ...

  9. [转]http://www.russbishop.net/xcode-exception-breakpoints

    原文:http://www.russbishop.net/xcode-exception-breakpoints Many people are not aware of Xcode's powerf ...

  10. JavaScript 跨域方法总结

    同源策略 在客户端编程语言中,如javascript和 ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚 ...