unity 分层动画动作分层 还能融合吗

用户名:jxw167
文章数:39
评论数:46
访问量:79824
注册日期:
阅读量:1297
阅读量:3317
阅读量:585993
阅读量:472000
51CTO推荐博文
&&&大家在开发端游的时候,我们经常需要通过工具程序手动合并dds图片,意思是为了提高效率,需要我们把一些小的图片合并成一张1024或者2048的大图片。它的图片合成跟NGUI的图集原理是一样的,在这里我们不用NGUI的合并图集,我们手动合并图集。&& 大家在游戏开发中我们需要讲一些零碎的图片合并成一张大的,比如3D场景中一些物件的材质,Avatar换装的材质等等。&& 接下来我们用代码实现,我们的实现原理是通过二叉树原理实现,首先我们需要定义AslatsNode节点,这个节点满足我们插入节点,建立二叉树,首先我们需要定义图集的大小,鉴于移动端硬件的限制,我们初步定义为1024,插入节点核心代码如下:&public&AtlasNode&Insert(Texture2D&image,&int&index)&{
&&&if&(image&==&null)&
&&&&return&
&&&&if&(child&!=&null)&
&&&&AtlasNode&newNode&=&child[0].Insert(image,&index);
&&&&if&(newNode&!=&null)
&&&&&return&newN
&&&&return&child[1].Insert(image,&index);
&&&&if&(hasImage)
&&&&&return&
&&&&if&(!ImageFits(image,&rc))
&&&&&return&
&&&&if&(PerfectFit(image,&rc))&{
&&&&&hasImage&=&
&&&&&imageRef&=&
&&&&&name&=&imageRef.
&&&&&sortIndex&=&
&&&&&return&
&&&&child&=&new&AtlasNode[2];
&&&&child[0]&=&new&AtlasNode();
&&&&child[1]&=&new&AtlasNode();
&&&&float&deltaW&=&rc.width&-&image.
&&&&float&deltaH&=&rc.height&-&image.
&&&&if&(deltaW&&&deltaH)&{
&&&&&child[0].rc&=&new&Rect(rc.xMin,&rc.yMin,&image.width,&rc.height);
&&&&&child[1].rc&=&new&Rect(rc.xMin&+&image.width&+&TEXTURE_PADDING,&rc.yMin,&rc.width&-&(image.width&+&TEXTURE_PADDING),&rc.height);
&&&&else&{
&&&&&child[0].rc&=&new&Rect(rc.xMin,&rc.yMin,&rc.width,&image.height);
&&&&&child[1].rc&=&new&Rect(rc.xMin,&rc.yMin&+&image.height&+&TEXTURE_PADDING,&rc.width,&rc.height&-&(image.height&+&TEXTURE_PADDING));
&&&&return&child[0].Insert(image,&index);
&&}以上代码实现了图片在二叉树进行图片的插入,接下来我们需要建立二叉树代码如下:public&void&Build(Texture2D&target)&{
&&&if&(child&!=&null)&{
&&&&if&(child[0]&!=&null)&{
&&&&&child[0].Build(target);&
&&&&if&(child[1]&!=&null)&{
&&&&&child[1].Build(target);
&&&if&(imageRef&!=&null)&{
&&&&Color[]&data&=&imageRef.GetPixels(0);
&&&&for&(int&x&=&0;&x&&&imageRef.&++x)&{
&&&&&for&(int&y&=&0;&y&&&imageRef.&++y)&{
&&&&&&target.SetPixel(x&+&(int)rc.x,&y&+&(int)rc.y,&data[x&+&y&*&imageRef.width]);&
&&&&if&(TEXTURE_PADDING&&&0&&&&BLEED)&{
&&&&&for&(int&y&=&0;&y&&&imageRef.&++y)&{
&&&&&&int&x&=&imageRef.width&-&1;
&&&&&&target.SetPixel(x&+&(int)rc.x&+&TEXTURE_PADDING,&y&+&(int)rc.y,&data[x&+&y&*&imageRef.width]);&
&&&&&for&(int&x&=&0;&x&&&imageRef.&++x)&{
&&&&&&int&y&=&imageRef.height&-&1;
&&&&&&target.SetPixel(x&+&(int)rc.x,&y&+&(int)rc.y&+&TEXTURE_PADDING,&data[x&+&y&*&imageRef.width]);&
&}第三步是创建图集代码如下:public&static&Atlas[]&CreateAtlas(string&name,&Texture2D[]&textures,&Atlas&startWith&=&null)&{
&&List&Texture2D&&toProcess&=&new&List&Texture2D&();
&&toProcess.AddRange(textures);
&&int&index&=&toProcess.Count&-&1;
&&toProcess.Reverse();&//&Because&we&index&backwards
&&List&Atlas&&result&=&new&List&Atlas&();
&&int&insertIndex&=&0;
&&if&(startWith&!=&null)&{
&&&insertIndex&=&startWith.root.sortI
&&while(index&&=&0)&{
&&&Atlas&_atlas&=&startW
&&&if&(_atlas&==&null)&{
&&&&_atlas&=&new&Atlas();
&&&&_atlas.texture&=&new&Texture2D(AtlasSize,&AtlasSize,&TextureFormat.RGBA32,&false);
&&&&_atlas.root&=&new&AtlasNode();
&&&&_atlas.root.rc&=&new&Rect(0,&0,&AtlasSize,&AtlasSize);
&&&startWith&=&
&&&while&(index&&=&0&&&&(_atlas.root.Contains(toProcess[index].name)&||&_atlas.root.Insert(toProcess[index],&insertIndex++)&!=&null))&{
&&&&index&-=&1;&
&&&result.Add(_atlas);
&&&_atlas.root.sortIndex&=&insertI
&&&insertIndex&=&0;
&&&_atlas&=&
&&foreach(Atlas&atlas&in&result)&{&
&&&atlas.root.Build(atlas.texture);
&&&List&AtlasNode&&nodes&=&new&List&AtlasNode&();
&&&atlas.root.GetBounds(ref&nodes);
&&&nodes.Sort(delegate&(AtlasNode&x,&AtlasNode&y)&{
&&&&if&(x.sortIndex&==&y.sortIndex)&return&0;
&&&&if&(y.sortIndex&&&x.sortIndex)&return&-1;
&&&&return&1;
&&&List&Rect&&rects&=&new&List&Rect&();
&&&foreach(AtlasNode&node&in&nodes)&{
&&&&Rect&normalized&=&new&Rect(node.rc.xMin&/&atlas.root.rc.width,&node.rc.yMin&/&atlas.root.rc.height,&node.rc.width&/&atlas.root.rc.width,&node.rc.height&/&atlas.root.rc.height);
&&&&normalized.x&+=&0.5f&/&atlas.root.rc.
&&&&normalized.width&-=&1.0f&/&atlas.root.rc.
&&&&normalized.y&+=&0.5f&/&atlas.root.rc.
&&&&normalized.height&-=&1.0f&/&atlas.root.rc.
&&&&rects.Add(normalized);
&&&atlas.uvRects&=&new&AtlasDescriptor[rects.Count];
&&&for&(int&i&=&0;&i&&&rects.C&i++)&{
&&&&atlas.uvRects[i]&=&new&AtlasDescriptor();
&&&&atlas.uvRects[i].width&=&(int)nodes[i].rc.
&&&&atlas.uvRects[i].height&=&(int)nodes[i].rc.
&&&&atlas.uvRects[i].name&=&nodes[i].
&&&&atlas.uvRects[i].uvRect&=&rects[i];
&&&atlas.root.Clear();
&&&atlas.texture.Apply(false,&false);
&&&SaveAtlas(atlas,&name);&&
&&&atlas.texture.Apply(false,&false);
&&return&result.ToArray();
&}&最后一步实现就是把我们生成的图集保存一下:&public&static&void&SaveAtlas(Atlas&atlas,&string&name)&{
&&if&(atlas&==&null&||&atlas.texture&==&null)
&&var&bytes&=&atlas.texture.EncodeToPNG();
&&if&(!System.IO.Directory.Exists(Application.dataPath&+&"/Debug/"))
&&&System.IO.Directory.CreateDirectory(Application.dataPath&+&"/Debug/");
&&&string&file&=&Application.dataPath&+&"/Debug/"&+&name&+&".png";
&&System.IO.File.WriteAllBytes(file,&bytes);
&}图片示例如下:以上是零散的图片,接下来我们将其合成图集:本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)unity animator动画融合时的上下半身速度分离控制 - CSDN博客
unity animator动画融合时的上下半身速度分离控制
游戏中要实现一边走一边攻击, 移动还分八方向的,所以使用了半身混合。
Animator 半身混合的处理,可以另外看资料。 &
简单来说 就是分2层:0层 播放基础移动动作,比如“Run”, 1层设了Mask(配置了上半身节点),weight设1(会完全覆盖0层的上半身动作),播放&Attack&
就能满足要求了。
不过,策划又有需求,需要玩家移动快时, 脚走路的动画要变快, 但上半身攻击不能变快。
结果Animator 只有一个speed属性, 会影响所有当前动画。
找了一下资料,参考如下链接,有好几种方案,作者帮忙踩过坑了,我就选择最后一种方案。
.cn/s/blog_13c4bf4b40102wup6.html
就是里用Animator 可以定义一些自定义参数(Parameters子页签), 控制动画的播放
上图左侧,可以看到动画的播放速度除了可以固定一个值外,还可配置Multiplier 乘以一个自定义系数。
这样,我们就不用在程序里一个动画一个动画调速度了,直接整个animator 设一次参数就行。
animator.SetFloat(&USpeed&, value); & &&
然后把9个移动的动作都做了一下配置。
就基本满足要求了。
不过个人也遇到了一个坑:
Animator所在节点如果 禁用又被启用时(比如怪物远离隐藏,后面又显示), 参数就被重置了。(Animitor主控切换参数当然也会被重置)
所以我在该节点挂的脚本里OnEnable函数里 每次都设一下&animator.SetFloat(&USpeed&, value);
本文已收录于以下专栏:
相关文章推荐
首先要分清两个概念,动作融合和动作混合
1动作融合是指,一个动作播放到结束后时,接着播另一个动作时,首尾进行融,实现平滑过渡的效果
2动作混合是指,本来是多个独立完整的动作,来用其中一个动作来控制...
Unity3D教程:动画融合、动画层、动画混合、附加动画、程序动画、动画重放和取样
动画脚本 Animation Scripting
Unity's 动画系统允许你创建一个漂亮的动画蒙皮角色,动画...
这个问题纠结了我挺久,在网上各种找相关帖子看,一直没有找到合适的设置方法,后来终于自己在状态机里面找到了处理方法。
原来的Animation动画速度是这样控制:
但是现在新版动画你在点进去看你...
public AnimatorController AC;
private float speed = 2f;
void IfNeedChangeSpeed ()
AC.layers [...
Unity3d 4.0新动画系统Mecanim初探(一)
Unity4.0正式版终于跟大家见面了,早在之前的Bata版中,我们就发现有一个新的动画系统:Mecanim,据说Unity科技想在Unit...
Unity 项目,需要对一个玩家拔武器的动作中,实现武器挂点的切换(从背部 挂到手上)。
1. 一种方案,动画美术直接编辑动画,定位到要变化挂点的帧(比如24帧),在Events里添加一个动画事件...
今天为了给一个怪物添加用触发打击掉血的方法,但是怪物的打击是左右摇晃武器,这样一次攻击会造成两次,所以,有一个解决办法就是,在动画某一帧添加个时间,使触发开启,再在后一帧,使触发失效!这样可以完美解决...
原文链接:/hammerc/p/4828774.html
Animator Controller在Unity中是作为一种单独的配置文件...
主要的层次结构式是, Animator 包含一个 AnimatorStateController 控制器, Controller 含有多个层,每个层含有多个状态, 每个状态可以绑定一个Animatio...
unity可以用两种方式控制动画
1. Animations,这种方式简单,直接 Play(“Idle”) 或者 CorssFade(“Idle”) 就可以播放动画
2. Animator...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)unity animation 控制动作之间的切换 - Unity3d技术 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSoho分层开发时Model层和Controller怎么对接最合理?
一、比如说,初始化了一个好友的List,
玩家从View层点击关注,然后Controller通知到Model层,
这时候Model层通知服务端状态改了,等服务端返回后,改掉本地的List中的数据实体,告诉Controller状态修改成功。
这时候Controller直接又从Model层把这个List拿走,让View层做了刷新操作。
我觉得这样做不太科学,应该只告诉View层哪一个好友的状态变了,而不是刷新整个列表。
所以,就要有一层面向View分装数据,我想问这个数据的封装应该放在Model层,还是Controller层?
二、
分层开发时,Model层和Contoller层的对接应该怎样做?最好大牛能给一小段两边的对接示例代码,借小弟参考一下。
要评论请先&或者&
同求,呵呵~~~
在control里面 就控制好 是哪个好友的状态改变了 然后把这个状态改变的好友发送给view 通知其更新这个好友的状态不知道是不是你要的答案
补充一句 control 就是控制层 &你要控制的逻辑 就是在它哪里实现的 &model只负责数据的存储 view负责展示数据
:补充一句 control 就是控制层 &你要控制的逻辑 就是在它哪里实现的 &model只负责数据的存储 view负责展示数据 谢谢
小项目而且是自己或少数人维护,根本没有必要分层,累不累
:小项目而且是自己或少数人维护,根本没有必要分层,累不累 真心累,可是决策开发方案的时候都是领导说的算。
:真心累,可是决策开发方案的时候都是领导说的算。 让行外人领导行内人,永远是失败的前奏,这种SB公司根本没有必要去浪费青春,公司有都是,要抱着强者心态面对职业生涯
当然还有一种是装B的行内人,那种工作能让人气死,以前我在五道口的某家知名公司,白天一天没活干,一到下班时间那个SB技术主管就让说有紧急工作,让我们加班,那点B加班费都不够在五道口那买快餐的,作了1个多月,把他在老外项目经理面前痛骂一顿,走人,不出一个月,哥又找到工作而且薪水高了4K多,工作很顺心
话题有点扯远了。传统的MVC模式并不适用于游戏的开发,用Rich Domain模式似乎更合适,即游戏对象不但包括了数据,还应该包括行为。同一类对象由某个Manager控制它们的生成,销毁和查找,不同的对象之间不直接访问调用,而应该通过Manager。3被浏览346分享邀请回答0添加评论分享收藏感谢收起写回答}

我要回帖

更多关于 unity3d 分层 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信