在Unity中创建一个基本的2D平台游戏

时间:2017-02-13 15:01:55

标签: unity3d 2d-games

我非常了解Unity并且想要创建一个非常简单的平台2D游戏,只需使用基本形状(正方形,矩形,圆形等)。 我搜索了互联网,发现了一个更复杂的教程,我需要它。

例如,我看到this,但其目标比我的目标更雄心勃勃 (我也看过其他教程,但我不能添加额外的链接)。

我希望创造一些非常简单的东西,以便了解程序的基础知识,然后尝试将一些更复杂的东西放在我身上。 有没有人对我有任何建议?

这是我想象的第一级,非常简单(又丑陋):
first level

我不知道从哪里开始,我认为从复杂的东西开始然后不理解任何东西并且仅复制是不合理的。 最简单的事情,使工作复杂化,因为我变得更实际,我是对的吗?

我补充一点,我知道Java和一些JavaScript。

我遵循了Fredrik的教程,这就是我got。 阅读代码,我看到了:

if(col.tag == "Coin") {
    coins++;
    Destroy(col.gameObject); // remove the coin
}

所以当玩家碰到硬币时,硬币不应该被摧毁?但在我的情况下不是那样..

1 个答案:

答案 0 :(得分:10)

这不是这个问题的正确论坛,但我有心情回答,所以我愿意。我希望它可以帮助你,即使它被标记,呵呵。

因此,您需要简单的2D平台游戏:

玩家

  • with physics(Rigidbody component)
  • 和碰撞(Box collider组件)
  • 左/右移动和跳跃(代码)
  • 可以检测触发器,例如通电/尖峰/电平结束(代码)

水平地面物体

  • 与对手(因此玩家可以在它上面行走)(Box collider组件)

<强>拾音器

  • 与触发器碰撞器(因此玩家可以通过它们并检测它们)(Box collider组件)

通过Unity启动创建一个新的2D项目。 检查2D按钮

  • 首先,让我们创建 GameObjects 。 GameObjects是游戏中的每个对象,通过右键单击层次结构(默认情况下主摄像头所在的位置)创建,然后单击&#34; Create Empty&#34;。但由于这是一个2D游戏,我们希望每个对象都是一个雪碧;一个图像。因此,不要点击&#34;创建空&#34;,点击&#34; 2D对象 - &gt;精灵&#34; 即可。这将是我们的播放器。现在,玩家看起来不像任何东西,因为没有图像可以代表它。通过将您选择的图像拖动到unity资源文件夹中的某个位置来更改此设置,然后将导入的图像拖到精灵上的精灵字段中。像这样:http://i.imgur.com/6cKQCss.gifv

  • 添加组件(例如:http://i.imgur.com/UkkxbgK.png Box Collider Rigidbody2d 以及新的 C#脚本称为......&#34;播放器&#34;。继续使用预先存在的&#34; Player&#34;标记我们的玩家游戏对象。标签,并在 Rigidbody 组件约束 - 折叠,检查&#34;冻结轮换:Z&#34;见图片:http://i.imgur.com/be6G2pB.png

您的播放器现在应该看起来像http://i.imgur.com/be6G2pB.png(+播放器脚本)

  • 这是播放器脚本。可能存在一些错误(例如,玩家可以永远跳跃,即使不在地面上),如果存在则尝试修复它们,或者如果它不能正常工作则进行改进。它要求玩家拥有 Rigidbody2D - &amp; Collider2D -component (碰撞器组件可以是箱式对撞机,重型对撞机等等任何形状),我们在最后一步中添加了它。 Rigidbody2d 给予玩家物理(重力下降,受强制影响)和对手使其能够碰撞有事。如果没有这个,玩家就会摔倒在地,无法检测到它是否接触到其他触发器/碰撞器。

这是我推荐你使用的C#-script。它与java非常相似,很容易上手。其中大部分都是统一的:

using UnityEngine;

public class Test : MonoBehaviour {

    float speed = 3f;
    Rigidbody2D rb;
    int coins = 0;
    Vector3 startingPosition; // If we hit a spike we will teleport player to starting position.

    void Start()
    {
        rb = GetComponent<Rigidbody2D>(); // Get the rigidbody component added to the object and store it in rb
        startingPosition = transform.position;
    }

    void Update()
    {
        var input = Input.GetAxis("Horizontal"); // This will give us left and right movement (from -1 to 1). 
        var movement = input * speed;

        rb.velocity = new Vector3(movement, rb.velocity.y, 0);

        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(new Vector3(0, 100, 0)); // Adds 100 force straight up, might need tweaking on that number
        }
    }


    void OnTriggerEnter2D(Collider2D col) // col is the trigger object we collided with
    { 
        if (col.tag == "Coin")
        {
            coins++;
            Destroy(col.gameObject); // remove the coin
        }
        else if (col.tag == "Water")
        {
            // Death? Reload Scene? Teleport to start:
            transform.position = startingPosition;
        }
        else if (col.tag == "Spike")
        {
            // Death? Reload Scene? Teleport to start:
            transform.position = startingPosition;
        }
        else if (col.tag == "End")
        {
            // Load next level? Heres how you get this level's scene number, add 1 to it and load that scene:
            // SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
        }
    }
}

接下来,让我们创建我们的关卡对象。

  • 右键单击层次结构,然后单击&#34; Create Empty&#34; 。这将作为我们所有级别对象的文件夹,以保持整洁。右键单击这个新创建的空游戏对象,然后单击&#34; 2D对象 - &gt;精灵&#34;并将此命名为#34; Floor&#34; (管他呢)。如果你想看到它,就像我们对玩家一样给它一个精灵! (再次gif:http://i.imgur.com/6cKQCss.gifv)给这个块一个&#34; Box Collider 2D&#34;零件。玩家现在可以站在这些物体上。你现在可以继续运行游戏,你应该能够拥有一个(某种程度上)功能的玩家和玩家站立的对象。在其Transform组件中更改其值以更改其大小属性。如果您需要更多(您将),您可以复制并粘贴此对象。还有一个名为&#34; Prefab&#34;的东西。它就像保存一个GameObject,所以你可以多次使用它,并且有更多的好处,你将在以后实现。要将GameObject保存为预制件,只需将对象从游戏层次结构拖到“项目资源”文件夹中的某个位置(就像我们对精灵所做的那样)。

  • 对于硬币,做同样的事情,但给它一个新标签(如何创建新标签:http://i.imgur.com/dYt9b0T.gifv)名为&#34; Coin&#34;在Box Colldier 2D组件中,选中&#34; Is Trigger&#34; 按钮。当我们走进它时,它会触发OnTriggerEnter2D并且玩家无法站在它上面;我们将直接通过它(因为它只是一个触发器)。我们将使用标记名称来识别播放器中OnTriggerEnter2D方法中的对象类型。

对您想要的大多数其他对象重复投币步骤。我们识别它们并处理我们想要的行动

void OnTriggerEnter2D(Collider2D col)
{
    if (col.tag == "Coin")
    {
        coins++;
        Destroy(col.gameObject); 
    }
    else if (col.tag == "Water")
    {
        transform.position = startingPosition;
    }
    else if (col.tag == "Spike")
    {
        // Death? Reload Scene? Teleport to start:
        transform.position = startingPosition;
    }
    else if (col.tag == "End")
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
    }

    /*
    *
    * Keep adding objects to collide with here!
    *
    */
}

这是您所询问的基本示例。更深入的了解......更重要的信息将是...

每个对象都具有包含对象的位置,旋转和缩放的变换。修改这些(在脚本中:transform.position,transform.rotation,transform.localScale)来修改......以及所说的属性。

要在代码中获取组件,您需要使用GetComponent(); Component是你想要的Component,就像我们在带有rb = GetComponent<Rigidbody>();的Player-script中所做的那样。

现在做这个例子,展开它,google&#34; Unity如何......&#34;如果你需要任何帮助,或者在这里询问你是否能让它发挥作用。

快乐的团结!哦,如果你对我的回答有疑问,请随便问一下。