在 Unity2D C# 中使用脚本更改精灵
Changing Sprites using scripts in Unity2D C#
我想做一款鸟瞰像素画风的游戏。
我目前设置了两个 sprite 表,拆分等等
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_ 开头的文件,然后计算它后面有多少个文件,这样它就知道在制作动画时要做什么。我希望此脚本检查 unity 编辑器中可查看的变量之一是否发生变化,一旦发生变化,它就会检查动画所需的一切。
在只有 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
(出于某种原因 Stack overflow 说上面是代码,所以我不得不那样做)
ground.cs 和 character.cs 是我想要制作的脚本,如上所述。
在我的对象视图中,我有
主摄像头
地面
字符
我实际上是 C# 和 JS 的新手,我基本上了解 C# 的语法(比如在哪里使用 {} 并将 ; 放在行尾)。如果你帮我解决这个问题,我要求你解释脚本,比如使用 // 来简单解释每个命令的作用,我知道一些但不是全部。我知道有人会说它在教程 X 等中有很好的记录,但大多数教程不在 unity 5 中,虽然帮助解决这个问题,但不要完全触及它。
谢谢大家的帮助,如果有什么不明白的question/request(比较复杂)我会解释的
你的问题冗长且难以理解,但我会尽力提供帮助,
首先,如果你想在统一编辑器中编辑值,我会建议使用像这样的序列化信息结构
[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 设置某种延迟的一种方法。
也许我完全错了,但在我看来,您正在尝试重新创建一个动画系统。
是否有您不使用 Unity 动画系统的具体原因?
你可以用它做你在这里描述的一切(改变精灵,选择动画速度)。而且您几乎没有代码可写。只需将精灵拖放到编辑器中即可开始
编辑 - 对第一条评论的回答:
您应该做的是创建您需要的所有动画。然后在动画器中,您选择哪个条件将触发到另一个动画的转换(例如,布尔跳转为真将转换到动画跳转)。然后在您的代码中您可以调用 GetComponent().SetBool("Jump", true)。
要拥有不同的角色,您可以创建不同的游戏对象(每个角色一个)。他们都有不同的动画师,动画是针对角色的。
如果你真的想要一个游戏对象和一个动画师,另一个解决方案是你也为你的动画添加字符串条件(例如,如果 character=="character1" 和 jump==true,过渡到跳跃动画)。
如果我是你,我会真正专注于测试和学习使用 Unity 动画师可以做的一切。我想不出您需要自己重新创建动画系统的情况
我想做一款鸟瞰像素画风的游戏。
我目前设置了两个 sprite 表,拆分等等 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_ 开头的文件,然后计算它后面有多少个文件,这样它就知道在制作动画时要做什么。我希望此脚本检查 unity 编辑器中可查看的变量之一是否发生变化,一旦发生变化,它就会检查动画所需的一切。
在只有 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
(出于某种原因 Stack overflow 说上面是代码,所以我不得不那样做)
ground.cs 和 character.cs 是我想要制作的脚本,如上所述。 在我的对象视图中,我有 主摄像头 地面 字符
我实际上是 C# 和 JS 的新手,我基本上了解 C# 的语法(比如在哪里使用 {} 并将 ; 放在行尾)。如果你帮我解决这个问题,我要求你解释脚本,比如使用 // 来简单解释每个命令的作用,我知道一些但不是全部。我知道有人会说它在教程 X 等中有很好的记录,但大多数教程不在 unity 5 中,虽然帮助解决这个问题,但不要完全触及它。
谢谢大家的帮助,如果有什么不明白的question/request(比较复杂)我会解释的
你的问题冗长且难以理解,但我会尽力提供帮助, 首先,如果你想在统一编辑器中编辑值,我会建议使用像这样的序列化信息结构
[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 设置某种延迟的一种方法。
也许我完全错了,但在我看来,您正在尝试重新创建一个动画系统。
是否有您不使用 Unity 动画系统的具体原因?
你可以用它做你在这里描述的一切(改变精灵,选择动画速度)。而且您几乎没有代码可写。只需将精灵拖放到编辑器中即可开始
编辑 - 对第一条评论的回答:
您应该做的是创建您需要的所有动画。然后在动画器中,您选择哪个条件将触发到另一个动画的转换(例如,布尔跳转为真将转换到动画跳转)。然后在您的代码中您可以调用 GetComponent().SetBool("Jump", true)。
要拥有不同的角色,您可以创建不同的游戏对象(每个角色一个)。他们都有不同的动画师,动画是针对角色的。 如果你真的想要一个游戏对象和一个动画师,另一个解决方案是你也为你的动画添加字符串条件(例如,如果 character=="character1" 和 jump==true,过渡到跳跃动画)。
如果我是你,我会真正专注于测试和学习使用 Unity 动画师可以做的一切。我想不出您需要自己重新创建动画系统的情况