1

我正在 Unity 中构建一个 2D 自上而下的游戏,我是 Unity 的新手。

玩家角色可以面向北方、南方、东方和西方。

对于角色面对的每个方向,他可以保持空闲、行走或攻击。

我目前正在使用角色绑定方法来制作动画。所以,玩家可以移动的每一部分,都是一个游戏对象精灵。例如,头部是一个游戏对象,左上腿、左下腿、左脚都是独立的游戏对象。

动画剪辑是在 Unity 中创建的。

角色面向的每个方向使用的精灵也不同,例如当角色朝北时,我们会看到角色的后脑勺,而当角色朝南时,我们会看到角色的全脸。

我有几个问题:

  1. 这是否意味着,我必须在 4 个方向(N、S、W 和 E)上为每种模式(空闲、行走、攻击)创建一组游戏对象?3x4 = 12 组游戏对象精灵?

  2. 如何让一组游戏对象只出现一次?例如只有一组出现,只有朝南的空闲可以出现,但其余的方向和模式应该“隐藏”?

  3. 如何从一种模式转换到另一种模式?例如,从面向南方的闲置到面向东方的步行到面向北方的攻击?

4

1 回答 1

1

首先,您是否尝试过 Anima2D - 它是 Unity Technologies 的免费 Unity 插件,用于使用骨骼制作 2D 角色动画。它使动画过程更加快速和容易。有一些关于 Anima2D 的有用视频:

https://www.youtube.com/watch?v=lg4AeOriIco&

https://www.youtube.com/watch?v=MhOJ742NSoM&

现在关于您的问题:

  1. 如果你想在不同的视图中看到你的角色,你必须制作至少 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);
     }
    

    但是如果你想在角色的左右两侧有所不同,你必须制作两组不同的游戏对象。

  2. 您可以使用 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;
             }
         }
     }
    
  3. 我没有看到任何变体可以在这些状态之间进行平滑过渡。所以我建议只切换 GameObjects,就像我在之前的代码中展示的那样。您还可以使用标准的 Unity 动画过渡使其更平滑。所以我建议你从Idle South切换到Idle East,然后从Idle East切换到Walking East。这看起来会比从 Idle South 切换到 Walking East 更好。

于 2020-07-03T09:31:18.540 回答