使用Unity2D C中的脚本更改Sprite

时间:2016-05-08 17:06:15

标签: c# animation unity5

我想制作一个鸟瞰图像艺术游戏。

我目前有两个精灵表设置,分裂和诸如此类 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)

之后的数字是关于:

的注释

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

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

第三个数字 - 所述动画的框架。 (由于我计划在后期制作动画场地,因此有理由这样做)

现在,我希望为一个可以在Unity编辑器中查看的可编辑值的角色(和地面相同)制作一个脚本,例如sprite渲染器之类的内容如何具有精灵,颜色等。这决定了什么要使用的第一个数字(见上文)第二个数字和第三个数字动画的延迟。然后,这将告诉sprite渲染器要加载哪些图片以及加载它们的速度。我还希望脚本扫描文件以例如character_0_0_开头,然后计算它后面的文件数,因此它知道在动画时要做什么。我希望这个脚本能够检查在unity编辑器中可以看到的变量之一的变化,并且一旦它确定了动画所需的一切,就会检查它。

在只有一个盒子可以统一编辑的情况下可以做其他事情,你可以将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

(由于某种原因,Stack溢出说上面是代码,所以我必须这样做)

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

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

感谢您的帮助,如果您对此问题/请求有任何疑问(这很复杂),我会解释。

2 个答案:

答案 0 :(得分:0)

你的问题很长,很难理解,但是我试着帮助, 首先,如果你想在统一编辑器中想要可编辑的值,我建议使用像这样的信息的序列化结构

[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);

      }

}

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

答案 1 :(得分:0)

也许我完全错了,但在我看来,你正试图重新创建一个动画系统。

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

你可以用它来完成你在这里描述的所有事情(改变精灵,选择动画速度)。你几乎没有代码可以编写。只需将精灵拖放到编辑器中即可开始

编辑 - 回答第一条评论:

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

要拥有不同的角色,您可以创建不同的游戏对象(每个角色一个)。他们都有一个不同的动画师,其中包含特定于角色的动画。 另外一个解决方案,如果你真的想要一个gameObject和一个动画师,那么你也要为你的动画添加字符串条件(例如,如果character ==“character1”和jump == true,则转换为跳转动画)。

如果我是你,我会专注于测试和学习使用Unity动画师所能做的一切。我想不出你需要自己重新创建动画系统的案例