【问题标题】:Create a basic 2D platformer game in Unity在 Unity 中创建一个基本的 2D 平台游戏
【发布时间】:2017-07-01 14:52:10
【问题描述】:

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

例如,我看到了this,但它的目标比我的更远大 (我也看过其他教程,但我无法添加其他链接)。

我很想创建一些非常简单的东西来理解程序的基础知识,然后尝试把我制作的更复杂的东西放进去。 有人对我有什么建议吗?

这是我想象的第一级,真的很简单(也很丑):

我不知道从哪里开始,我认为从复杂的东西开始然后什么都不懂,只复制是没有意义的。 随着我变得更实际,我更喜欢从简单的工作和复杂的工作,对吗?

我补充说我知道 Java 和一点 JavaScript。


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

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

那么当玩家碰撞到硬币时,硬币不应该被破坏吗?但在我的情况下不是那样..

【问题讨论】:

  • 我对同样的事情也很感兴趣,但我看到有人建议先学习 Java 或 C/C++ 来玩 Flash 游戏。我想看看人们的回答
  • 从简单开始就好。我认为您在http://gamedev.stackexchange.com/ 上找到答案可能会更好
  • 这是一个非常广泛的问题,需要非常深入的回答。正如上面的评论所说,它可能更适合在另一个论坛上,但我会一起写一些东西让你开始!等一下
  • @Fredrik 感谢您的宝贵时间,我会焦急地等待!
  • 关于您的更新。使用 Debug.Log("消息" + 变量);登录到控制台。在 OnTriggerEnter2D 方法中放置一个。我从未测试过它,所以它可能无法正常工作,呵呵。

标签: unity3d 2d-games


【解决方案1】:

这不是这个问题的正确论坛,但我有心情回答,所以我会的。希望能帮到你,就算被举报了,呵呵。

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

玩家

  • 带有物理(刚体组件)
  • 和碰撞(Box collider 组件)
  • 左右移动和跳跃(代码)
  • 可以检测通电/尖峰/关卡结束(代码)等触发器

平整地面对象

  • 带有碰撞器(因此玩家可以在上面行走)(盒子碰撞器组件)

皮卡

  • 带有触发碰撞器(因此玩家可以通过它们并检测它们)(盒子碰撞器组件)

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

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

  • 添加组件(例如:http://i.imgur.com/UkkxbgK.pngBox ColliderRigidbody2d 和一个新的C# 脚本称为...“播放器”。继续并用预先存在的“玩家”标签标记我们的玩家游戏对象,并在 Rigidbody 组件约束折叠下,检查“冻结旋转:Z”参见图片:http://i.imgur.com/be6G2pB.png

您的播放器现在应该类似于 http://i.imgur.com/be6G2pB.png(+ 播放器脚本)

  • 播放器脚本出现了。可能存在一些错误(例如,玩家可以永远跳跃,即使不在地面上),如果存在尝试修复它们,或者如果效果不够好则改进。它要求玩家有一个Rigidbody2D-&Collider2D-组件(一个collider组件可以是box collider、circel collider等任何形状) em>,我们在最后一步添加的。 Rigidbody2d 赋予玩家物理(重力下落,受力影响),collider 赋予玩家碰撞的能力强> 用东西。如果没有这个,玩家只会掉到地上,无法检测到它是否接触到其他触发器/碰撞器。

这是我推荐您使用的 C# 脚本。它与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);
        }
    }
}

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

  • 在层次结构中单击鼠标右键,然后单击“创建空”。这将作为我们所有关卡对象的文件夹,以保持整洁。右键单击这个新创建的空游戏对象,然后单击“2D Object -> Sprite”并将其命名为“Floor”(或其他名称)。如果你想看到它,就像我们对播放器所做的那样给它一个精灵! (gif 再次:http://i.imgur.com/6cKQCss.gifv)给这个块一个“Box Collider 2D”组件。玩家现在可以站在这些物体上。您现在可以继续运行游戏,您应该能够拥有一个(有些)功能正常的玩家和可供玩家站立的物体。更改其 Transform 组件中的值以更改其大小属性。如果您需要更多(您会这样做),您可以复制并粘贴此对象。还有一种叫做“预制”的东西。这就像保存一个游戏对象,因此您可以多次使用它,并且您将在以后意识到更多的好处。要将 GameObject 保存为 Prefab,只需将 Object 从 Game Hierarchy 拖动到 Projects Assets 文件夹中的某个位置(就像我们对 sprite 所做的那样)。

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

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

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 是您想要的组件,就像我们在 Player-script 中使用 rb = GetComponent&lt;Rigidbody&gt;(); 所做的那样。

现在做这个例子,展开它,如果你需要任何帮助,谷歌“Unity 如何...”,或者如果你不能让它工作,请在这里询问。

团结愉快!哦,如果你对我的回答有任何疑问,那就问吧。

【讨论】:

  • 不错的答案。我认为如果他遵循 Unity 的 2D 项目教程的one,Op 会很好。 @jhhoff02 你可以在 3 天左右后放赏金,但今天不行。
  • 哈哈,你的赞赏就是我所需要的!喜欢写它,虽然我不得不匆忙写到最后。干杯!
  • 非常感谢您的帮助,很棒的教程!我完成了教程,我只有一个小问题(我已经编辑了问题),你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多