RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 669431
Accepted
dakiesse
dakiesse
Asked:2020-05-23 03:47:39 +0000 UTC2020-05-23 03:47:39 +0000 UTC 2020-05-23 03:47:39 +0000 UTC

Sprite Atlas:如何上传,mappit?

  • 772

复杂的问题。因此,有一个 png'shka,上面有一堆 30x30 的瓷砖。我Sprite Editor在帮助下将其全部剪切并得到了一个图集(我正确地调用了实体吗?):

在此处输入图像描述

此外,我想以某种方式将地图集的每个元素映射到常量:

public class TitleMap
{
    public const string GROUND_DESERT = "desert";
    public const string GROUND_GREEN_GRASS = "green_grass";
    public const string GROUND_SANDY_LOAM = "sandy_loam";


    // Common roads
    public const byte NEW_VERT_ROAD = 1;
    public const byte NEW_HORZ_ROAD = 2;
    public const byte BRK_VERT_ROAD = 3;
    public const byte BRK_HORZ_ROAD = 4;
    public const byte RSD_HORZ_ROAD = 6;
    public const byte CROSS_ROAD    = 8;

    // Rotated roads
    public const byte RTT_BOTTOM_RIGHT_ROAD = 10;
    public const byte RTT_BOTTOM_LEFT_ROAD = 11;
    public const byte RTT_TOP_LEFT_ROAD = 12;
    public const byte RTT_TOP_RIGHT_ROAD = 13;

    // Decor
    public const byte GREENERY_BUSH = 15;
    public const byte GREENERY_TREE_1 = 16;
    public const byte GREENERY_TREE_2 = 17;
    public const byte GREENERY_TREE_3 = 18;

    // ......
}

为了将CSV这些值发送给我,在它们之后我渲染了这些精灵。

总计:如何加载图集,然后使用它,之前已经将它映射到常量?

unity3d
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Xumera_hZ
    2020-05-23T10:36:11Z2020-05-23T10:36:11Z
    public const int CountAtlas= 10;
    public Dictionary<int, Sprite[]> allSprites;
    
    void Start () {
        allSprites = new Dictionary<int, Sprite[]>();
        for(int i= CountAtlas - 1; i >= 0; i--)
        {
            allSprites.Add(i, Resources.LoadAll<Sprite>("Test" + i));
        }
    }
    //Функция для запроса спрайта
    public Sprite GetSprite(int idAtlas,int idSprite)
    {
        return allSprites[idAtlas][idSprite];
    }
    

    您可以通过这种方式从图集中加载精灵(此处为“Test”+资源文件夹中图集的名称/路径)。并将每个图集的常数从 0-N 减少到索引。您可以在游戏开始时执行此操作,或提前将其添加到脚本中。

    ps 在这种使用常量的方法中,一个巨大的减号,如果您需要删除图集中间或开头的一些精灵,则其他所有内容都需要重新编号。

    pss 可以这样避免图集中常量和数字的硬绑定:

        class SpriteInfo
    {
        public Sprite sprite;
        public int index;
    }
    public const int CountAtlas = 10;
    Dictionary<int, SpriteInfo[]> allSprites;
    //зарезервированное имя для спрайтов в атласе
    public const string NameSpriteInAtlas="sprite";
    
    public void SetSprites()
    {
        allSprites = new Dictionary<int, SpriteInfo[]>();
        int startIndex = NameSpriteInAtlas.Length;
        List<SpriteInfo> list = new List<SpriteInfo>();
        for (int i = CountAtlas - 1; i >= 0; i--)
        {
            Sprite[] sprites = Resources.LoadAll<Sprite>("Test" + i);
            for(int j= sprites.Length - 1; j >= 0; j--)
            {
                Sprite spr= sprites[j];
                int ind;
                if (CheckSprite(spr.name, startIndex,out ind))
                {
                    list.Add(new SpriteInfo() { sprite = spr, index = ind });
                }
            }
            if (list.Count != 0) allSprites.Add(i, list.ToArray());
            list.Clear();
        }
    }
    
    public const int Title1 = 0;
    public const int Title2 = 1;
    public const int Title3 = 2;
    public const int Title4 = 3;
    
    bool CheckSprite(string nameSprite,int startIndex,out int index)
    {
        index = -1;
        int num;
        if (!int.TryParse(nameSprite.Substring(startIndex), out num)) goto Label1;
        switch (num)
        {
            case Title1: index = Title1; return true;
            case Title2: index = Title2; return true;
            case Title3: index = Title3; return true;
            case Title4: index = Title4; return true;
        }
        Label1:
        Debug.LogError(GetType()+ " error: nameSprite="+ nameSprite+" is not exist");
        return false;
    }
    //Функция для запроса спрайта
    public Sprite GetSprite(int idAtlas,int idSprite)
    {
        if (!allSprites.ContainsKey(idAtlas))
        {
            Debug.LogError(GetType() + " error: idAtlas=" + idAtlas + " is not exist");
            return null;
        }
        SpriteInfo[] list = allSprites[idAtlas];
        for(int i= list.Length - 1; i >= 0; i--)
        {
            if (list[i].index == idSprite) return list[i].sprite;
        }
        Debug.LogError(GetType() + " error: idSprite=" + idSprite + " is not exist");
        return null;
    }
    

    底线是你根据这些常量给精灵命名,然后你可以检查精灵中是否有一个名字带有这样的常量。

    剩下的只是根据需要重命名所有精灵,并根据常量使用索引将它们缝合起来。您可以为每个地图集单独执行此操作(在我的情况下,适用于所有地图集)。并且在为精灵添加或删除新常量时,还需要编辑CheckSprite,因为编号将不起作用,您不需要为每个图集从0-N进行编号。

    这样的检查在启动时会给一个小的Overhead,所以最好提前做好并保存。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5