我正在 Unity 中构建一个 2D 自上而下的游戏,我是 Unity 的新手。
玩家角色可以面向北方、南方、东方和西方。
对于角色面对的每个方向,他可以保持空闲、行走或攻击。
我目前正在使用角色绑定方法来制作动画。因此,玩家可以移动的每个部分都是一个游戏对象精灵。例如,头部是一个游戏对象,左上腿、左下腿、左脚都是独立的游戏对象。
动画剪辑是在 Unity 中创建的。
角色面向每个方向使用的精灵也不同,例如,当角色面向北方时,我们会看到角色的后脑勺,但当角色面向南方时,我们会看到角色全脸。
我有几个问题:
这是否意味着,我必须在 4 个方向(N、S、W 和 E(上为每种模式(空闲、行走、攻击(创建一组游戏对象? 3x4 = 12 组游戏对象精灵?
如何让 1 组游戏对象只出现 1 次? 例如,只出现 1 组,只能出现朝南的空闲,但其余的方向和模式应该"隐藏"吗?
如何从一种模式过渡到另一种模式? 例如,从面向南方的闲置到面向东方的行走再到面向北方的攻击?
首先,您是否尝试过Anima2D - 它是Unity Technologies的免费Unity插件,用于使用骨骼对2D角色进行动画处理。它使动画过程更快,更容易。有一些关于Anima2D的有用视频:
https://www.youtube.com/watch?v=lG4AeOriIco&
https://www.youtube.com/watch?v=MhOJ742NSoM&
现在关于您的问题:
-
如果你想在不同的视图中看到你的角色,你必须制作至少3组游戏对象(正面,背面和轮廓 - 向右或向左(。 但是您不必为角色向右或向左转创建不同的组。您可以将 transform.scale.x 更改为 -1 或 1。例如:
if(/*Character is turned right*/){ transform.localScale = new Vector3(1, 1, 1); } else if(/*Character is turned left*/){ //This will mirrow you character transform.localScale = new Vector3(-1, 1, 1); }
但是,如果你想区分角色的右侧和左侧,你必须制作两组不同的游戏对象。
-
您可以使用 GameObject.SetActive 关闭或打开场景中的某些游戏对象。 例如,假设您有以下游戏对象结构: 游戏对象的结构(您的脚本位于播放器上( 然后你可以使用这样的代码:
//Choose any name for class public class PlayerController : MonoBehaviour { //Enum for states of player enum state{ Front = 0, Back = 1, Profile = 2 } //Set 0th to Front state GO, 1st to Back state GO, 2nd to Profile state GO in inspector [SerializeField] private List<GameObject> parentsForEachState; //Field to know current state and current set of GameObjects to show private state currentState = state.Front; void SwitchState(state newState){ for(int i = 0; i < 3/*Number of states*/; i++){ if(i == (int)newState){ parentsForEachState[i].SetActive(true); } else { parentsForEachState[i].SetActive(false); } //Also set animation of parentsForEachState[newState] to what you want currentState = newState; } } }
-
我没有看到任何变体可以在这些状态之间平稳过渡。因此,我建议只切换游戏对象,如前面的代码所示。您还可以使用标准 Unity 动画过渡来使其更平滑。所以我建议你从闲置的南方切换到闲置的东方,然后从闲置的东方切换到向东走。这看起来会更好,然后只是从闲置的南方切换到向东行走。