乐趣区

关于editor:如何通过Timeline的形式实现技能编辑器

1)如何通过 Timeline 的模式实现技能编辑器
​2)Addressable 如何通过 Group Name 取得 Group 下的 Key
3)Unity 如何获取 Sprite 在 Sprite Packer 中的 UV 值
4)AnimatorController 在 UnityEditor 下,如何获取所有的状态名
5)Unity 为 UGUI 的 Mask 做了怎么的解决


这是第 228 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。

UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

Editor

Q:我的项目须要通过 Timeline 的模式实现做个技能编辑器,时间轴的模式是怎么实现的?​整个的技能编辑器有没有相干的参考?

A1:倡议学习 Timeline 的应用办法以及传统技能编辑器是怎么做的,而后再想想看如何联合。上面这篇文章能够先读一读:《ACT 技能编辑器的制作教训分享》

该问答由 UWA 提供

A2:可参考官网的 Timeline 扩大,2017 年 Unite 也有个相干的主题:
https://assetstore.unity.com/packages/essentials/default-playables-95266

感激羽飞 @UWA 问答社区提供了答复

A3:第一,时间轴的模式是怎么实现的?

你能够参考几个 Unity 的插件:
https://assetstore.unity.com/packages/tools/animation/cinematic-sequencer-slate-56558
举荐 SLATE,扩大起来比拟不便:
https://assetstore.unity.com/packages/tools/animation/flux-18440

第二,技能编辑器思路。
有了下面的时间轴框架之后就是基于时间轴去开发不同类型的帧,比方:播放特效帧、动画帧和打击点帧等等。

举个特效的例子:

  1. 技能特效不外乎几个参数:特效名、偏移信息和挂接点等等;
  2. 而后须要去实现执行到这个关键帧的时候具体怎么执行的业务代码,比方依据帧下面的配置的特效名参数加载出这个特效,偏移信息和挂接点参数设置特效的 Transform;
  3. 帧的长度就是这个特效的生命周期,帧执行完退出时做下销毁工作。

感激波波 @UWA 问答社区提供了答复


Addressable

Q:Addressable 能够通过 Group Name 取得这个 Group 下的 Key 吗?

我把热更新放在了游戏开始时对立做。更新流程大略是:创立一个加载界面(资源在 Addressable 中是独立的 Group,暂且叫 startGroup),接着查看 Catalog 是否有更新,而后拿到所有的 Key 值下载资源。

这个流程是没有问题的,问题出在:如果在更新时网络中断了,Addressable 仿佛会把更新列表里的资源内存开释掉,应用了所有 Key 来进行下载的加载界面资源会失落(变黑)。经测试,手动把 startGroup 里的 Key 排除掉,就没有这个问题。所以通过 Group Name 如何取得这个 Group 下的 Key?或者有好的更新计划分享吗?

A1:有一个外部函数:

internal bool GetResourceLocations(object key, Type type, out IList<IResourceLocation> locations) 

能够参考一下具体实现,这也是相似 GetDownloadSizeAsync 这样的函数在外部调用的。
至于资源失落问题信息不够不太好判断了。

感激黄程 @UWA 问答社区提供了答复

A2:能够把 startGroup 里的资源的 Label 都设置成了“start”,通过 Lable 能够拿到 Location 列表,而后把这个列表中的 Key 值从总列表外面排除:

public static List<string> GetAllKeys(string labelName)
{
    var t = Addressables.ResourceLocators;
    List<string> keys = new List<string>();
    foreach (var location in  t)
    {if (!(location is ResourceLocationMap)) continue;
        ResourceLocationMap locationMap = location as ResourceLocationMap;
        locationMap.Locate(labelName, typeof(object), out var startLocationList);
        foreach (var info in locationMap.Locations)
        {if(info.Value.Count == 0) continue;
            string str = info.Value[0].PrimaryKey;
            bool isHas = false;
            foreach (var startLocation in startLocationList)
            {if(startLocation.PrimaryKey == str)
                {
                    isHas = true;
                    break;
                }
            }
            if (isHas) continue;
            string key = info.Key.ToString();
            if (int.TryParse(key, out var num))
            {continue;}
            if (!keys.Contains(key))
            {keys.Add(key);
            }
        }
    }
    /*foreach (var locator in t)
    {foreach (var key in locator.Keys)
        {
            int value = 0;
            string str = key.ToString();
            if (!int.TryParse(str, out value))
            {keys.Add(str);
            }
        }
    }*/
    return keys;
} 

感激大侠陈二狗 @UWA 问答社区提供了答复


Texture

Q:应用了 Sprite Packer 的打图集,如何在运行时候获取 Sprite 在所在图集中的 UV 值?

A:能够应用以下形式:
Sprites.DataUtility.GetOuterUV(activeSprite)

感激题主凡凡 @UWA 问答社区提供了答复


Animation

Q:AnimatorController 被放在 UnityEditor 下了,该怎么获取所有的状态名?

A:能够参考一下:
https://stackoverflow.com/questions/41709325/retrieve-all-animator-states-and-set-them-manually-in-code

另外,AnimatorController 从 Unity5.2 开始就始终是 Editor 命名空间下的。

感激 Xuan@UWA 问答社区提供了答复


UGUI

Q:因为某些起因,我把 UGUI 的 Mask 组件反编译了,而后把代码复制一份改个名字进行测试应用。
而后发现,复制进去的 Mask 居然不失效。

原生的 Mask 通过批改组件上的材质,实现裁剪,它会批改本人跟所有子节点的材质;而复制进去的这个 Mask,只会批改本人的材质,齐全不会影响子节点。

想理解下,Unity 是如何实现让 Mask 影响所有子节点材质的?

A1:Mask 组件只是一个告诉组件和标识裁切信息的类,在组件开启后告诉子节点中所有的 Text,Image(这些组件继承自 MaskableGraphic)开始裁切计算,MaskableGraphic 会去找父节点中离它最近的 Mask 组件获取裁剪信息,单纯复制一个 Mask 没有用。

感激陈祥 @UWA 问答社区提供了答复

A2:依据 MaskableGraphic 的代码,外面只有找以后节点的 Mask 组件,并没有寻找父节点。写了个 AlphaMask 组件做软裁剪,发现如果父节点挂了 Mask 后,这个组件会不失常。经查发现是 Mask 替换了材质,把原有材质里的信息搞丢了。

而后参考 Mask 的实现调整一下 AlphaMask。次要是替换子节点材质这部分,因为在我的项目中有很多动静节点,当初须要让每个动静节点本人调用代码替换材质。

最终察觉,MaskabelGraphic 是通过调用 MaskUtilities.GetStencilDepth 拿到父节点 Mask 的信息的,没用间接 GetComponentInParent。

感激题主 Walker@UWA 问答社区提供了答复

封面图起源:A Terrible Kingdom
以创造性的形式编写游戏时间轴。


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)

退出移动版