U3D简单得换装技术
四个类完成,前提是 资源得名字配合
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简单得换装技术的更多相关文章
- 浅谈角色换装功能--Unity简单例子实现
在前置篇中,基本上梳理了一下换装功能背后涉及到的美术工作流.但程序员嘛,功能终归是要落到代码上的.本文中会结合Unity提供的API及之前提到的内容来实现一个简单的换装功能.效果如下: (图1:最终效 ...
- DragonBones龙骨换装(局部换装+全局换装)
参考: Egret官方换装动画 Egret换装三种方式 CSDN(全局换装) egret使用DragonBones实现简单的换装 换装,主要是替换任意插槽的图片,来达到局部换装的目的. 游戏中可以只制 ...
- cocos2d下,优秀骨骼spine的换装思路
语文老师说,文章要有个好开头!!! 最近正在引入spine骨骼代替dragon bone骨骼,既然要替代,那么原先在dragon bone上的一些额外需求,不管dragon bone上能不能实现,都应 ...
- Unity动态换装之Spine换装
注:转载请注明转载,并附原链接 http://www.cnblogs.com/liaoguipeng/p/5867510.html 燕双飞情侣 一.动态换装原理 换装,无非就是对模型的网格,或者贴图进 ...
- 【AS3 Coder】任务六:人物换装(纸娃娃)系统的制作
使用框架:AS3(Flash Professional CS5.0及更高版本 + Flash Buider)任务描述:了解人物换装系统的制作原理难度系数:2 本章源码下载:http://www.iam ...
- 『HTML5梦幻之旅』 - 仿Qt演示样例Drag and Drop Robot(换装机器人)
起源 在Qt的演示样例中看到了一个有趣的demo.截图例如以下: 这个demo的名字叫Drag and Drop Robot,简单概括而言,在这个demo中,能够把机器人四周的颜色拖动到机器人的各个部 ...
- 【Unity3D】3D角色换装++ Advance
http://www.cnblogs.com/dosomething/archive/2012/12/15/2818897.html 本文在之前的文章Unity3D角色换装的原理 基础上做一个补充 给 ...
- 3D游戏中人物换装解决方案
换装基本上是每个网游都必须有的一个功能,每种网游的做法都各有不同,有些是换掉整个模型,有些则是通过可以换掉模型的一个部分完成.前者属于整体换,相对简单些:后者则是通过部分替换实现,目前用的比较多,本文 ...
- Blender建模与游戏换装(转载文)
本文转载自https://my.oschina.net/huliqing/blog/880113?hmsr=toutiao.io 如果本文涉及侵权行为,请原作者联系博主邮箱,我将及时进行删除处理 博主 ...
随机推荐
- 【SSRS】入门篇(四) -- 向报表添加数据
原文:[SSRS]入门篇(四) -- 向报表添加数据 定义好数据集后 [SSRS]入门篇(三) -- 为报表定义数据集 ,就可以开始设计报表了,将要显示在报表的字段.文本框.图像和其他项从工具箱拖放到 ...
- 如何配置Spring的XML文件及使用
App.config <?xml version="1.0" encoding="utf-8" ?> <configuration> & ...
- WebService使用DataSetSurrogate压缩Dataset的序列化和解压反序列化传输 (转)
转自:http://blog.163.com/hehong0925@126/blog/static/1339333372012102242920521/ 在WebService中将dataset序列化 ...
- bitnami redmine安装、配置、备份、恢复(这篇文章靠谱)
bitnami redmine安装.配置.备份.恢复 2012-12-17 12:33 2596人阅读 评论(0) 收藏 举报 1. 安装时语言选择英文,不可以选择中文,否则不能正常运行,可以在账户里 ...
- 简话ASP.NET Web API
简话ASP.NET Web API 在vs2012中,我们很容易在根据选择的ASP.NET MVC Web应用程序来新建一个Web API应用,聪明的你一定想见得到,Web API和MVC有着某种联系 ...
- 给Angularjs配上Requirejs
给Angularjs配上Requirejs 需要考虑的事情: 1.js.css.template都按需加载,js主要就controller: * js和css都可以用requirejs和它的插件解决, ...
- C#控件怎样获取,和失去焦点的处理
publicForm1() { InitializeComponent(); textBox1.Enter+=newEventHandler(textBox1_Enter);//获得焦点事件 text ...
- discuz 门户功能增加自定义keywords字段
discuz的门户的“发布文章”功能中,没有自动添加keywords字段,结果在文章页面中的meta的keywords中只显示标题,这样对于seo及其不利,今天整理了添加keywords字段方法. 一 ...
- [转]http://www.russbishop.net/xcode-exception-breakpoints
原文:http://www.russbishop.net/xcode-exception-breakpoints Many people are not aware of Xcode's powerf ...
- JavaScript 跨域方法总结
同源策略 在客户端编程语言中,如javascript和 ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚 ...