【问题标题】:Changing Sprites using scripts in Unity2D C#在 Unity2D C# 中使用脚本更改 Sprites
【发布时间】:2016-09-03 07:17:21
【问题描述】:

我想做一个鸟瞰像素艺术游戏。

我目前设置了两个精灵表,并拆分和诸如此类 groundSheet 和 characterSheet 这些被分成了

ground_0_0_0 (A concrete floor)

ground_1_0_0 (grass)

character_0_0_0 (man idle animation frame 1)

character_0_0_1 (man idle animation frame 2)

character_0_1_0 (man run animation frame 1)

character_0_1_1 (man run animation frame 2)

character_1_0_0 (woman idle animation frame 1)

character_1_0_1 (woman idle animation frame 2)

character_1_1_0 (woman run animation frame 1)

character_1_1_1 (woman run animation frame 2)

后面的数字是关于:

第一个数字 - 主要的精灵动画集(例如人)

第二个数字 - 正在使用的动画集(例如运行或空闲)

第三个数字 - 所述动画的帧。 (地面有这个,因为我计划稍后有动画理由)

现在,我希望为角色(和地面类似)制作一个脚本,该脚本具有可在统一编辑器中查看的可编辑值,例如精灵渲染器之类的东西如何具有精灵、颜色等。这决定了什么使用的第一个数字(见上文)第二个数字和第三个数字的动画延迟。然后这将告诉精灵渲染器要加载哪些图片以及加载它们的速度。我还希望脚本扫描以例如 character_0_0_ 开头的文件,然后计算其后有多少个文件,这样它就知道在制作动画时要做什么。我希望这个脚本检查统一编辑器中可查看的变量之一是否发生变化,一旦发生变化,它就会检查动画所需的所有内容。

可以在只有 1 个框可以统一编辑的情况下进行其他操作,您可以将其放入 character_0_0_ 或 ground_1_0_ 或类似的东西,然后它会以这种方式检查所有内容(它还使脚本具有通用性,并且可以在地面上使用,字符和墙壁(我稍后会添加))。

这可能看起来令人困惑,但对我来说很有意义,你们中的许多人可能会提到一种更简单的方法来制作动画等,但请只在它符合我上面的要求时才说这些。

For scripts and such my file layout:
/Assets
/scripts
    ground.cs
    character.cs
/sprites
    characterSheet.png
        character_0_0_0
        character_0_0_1
        character_0_1_0
        character_0_1_1
        character_1_0_0
        character_1_0_1
        character_1_1_0
        character_1_1_1
    groundSheet.png
        ground_0_0_0
        ground_1_0_0

(由于某种原因堆栈溢出说上面是代码,所以我不得不这样做)

ground.cs 和 character.cs 是我想要制作的脚本,如上所述。 在我的对象视图中,我有 主摄像头 地面 人物

我实际上是 C# 和 JS 的新手,我基本了解 C# 的语法(比如在哪里使用 {} 并将 ; 放在行尾)。如果你帮我解决这个问题,我要求你解释一下脚本,比如使用 // 来简单地解释每个命令的作用,我知道一些但不是全部。而且我知道有人会说它在教程 X 等中有很好的记录,但大多数教程都不是统一 5 并且在帮助解决这个问题时并没有完全触及它。

感谢您的帮助,如果您对这个问题/请求有任何不明白的地方(非常复杂),我会解释。

【问题讨论】:

    标签: c# animation unity5


    【解决方案1】:

    也许我完全错了,但在我看来,您正在尝试重新创建动画系统。

    是否有您不使用 Unity 动画系统的具体原因?

    你可以用它来做你在这里描述的一切(改变精灵,选择动画速度)。而且您几乎不需要编写任何代码。只需将精灵拖放到编辑器中即可开始


    编辑 - 回答第一条评论:

    您应该做的是创建您需要的所有动画。然后在动画器中,您选择哪个条件将触发到另一个动画的过渡(例如,布尔跳转为真将过渡到动画跳转)。然后在您的代码中,您可以调用 GetComponent().SetBool("Jump", true)。

    要拥有不同的角色,您可以创建不同的游戏对象(每个角色一个)。他们都有一个不同的动画师,带有特定于角色的动画。 如果您真的想要一个游戏对象和一个动画师,另一种解决方案是您还为动画添加字符串条件(例如,如果 character=="character1" 和 jump==true,则过渡到跳跃动画)。

    如果我是你,我会真正专注于测试和学习 Unity animator 所能做的一切。我想不出你需要自己重新创建动画系统的情况

    【讨论】:

    • 原因是因为我希望能够使用脚本来更改动画,而以当前的动画系统我认为这是不可能的,但如果可以的话,请告诉我。跨度>
    • 我编辑了我的答案,希望它更清楚。您绝对可以让动画师在许多动画之间切换。并且可以通过代码与之通信
    【解决方案2】:

    您的问题冗长而难以理解,但我试图提供帮助, 首先,如果你想在统一编辑器中编辑值,我建议使用这样的序列化信息结构

    [System.Serializable] // this makes it viewable in the inspector
    public struct Sprite_Manager;
    {  
    
        public Sprite[] Render_Sprites; // array of sprites to store sprites
        public SpriteRenderer S_Renderer;
        public float Anim_Delay;
    }
    
    public class Character : MonoBehavior {
    
      Sprite_Manager SMG = new Sprite_Manager(); // instantiate a new instance of the struct                                                                          
    
          void Set_Sprite()
           {
                 for(int i = 0; i < SMG.Render_Sprites.Length; i++)
                  {
                         SMG.S_Renderer.sprite = SMG.Render_Sprites[i];
                  }
    
    
           }
    
          void Update
          {
    
             Invoke("Set_Sprite", SMG.Anim_Delay);
    
          }
    
    }
    

    不确定这是否正是您要寻找的,但这是您可以设置基于 sprite 的信息结构并在将新 sprite 传递给渲染器时使用 Invoke 设置某种延迟的一种方法。

    【讨论】:

    • 我确实意识到我的请求/问题的复杂性,我假设我必须在某处填补您的代码中的空白,否则我会出错。同时我会尝试停止错误,如果您知道unity动画编辑器是否可以使用脚本更改,请告诉我。
    • 我已经设法让动画编辑器工作,我现在唯一的问题是如何使用条件部分,不过我会为此创建一个单独的问题。
    • 我的答案或多或少只是一个例子然后是正确的答案,我主要是想展示如何使用结构使信息在检查器中可编辑,但是是的,您可以创建对 Animator 组件的引用还有 AnimationClips
    猜你喜欢
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2017-02-01
    • 2021-01-05
    相关资源
    最近更新 更多