2017-02-13 180 views
3

我知道很少的Unity,并且想要创建一个非常简单的平台2D游戏,只需使用基本形状(正方形,长方形,圆形等)。 我搜索了互联网,并找到了我需要的更复杂的教程。在Unity中创建一个基本的2D平台游戏

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

我很想创建一些非常容易的东西来理解程序基础知识,然后尝试将由我制作的更复杂的东西。 有没有人对我有任何建议?

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

我不知道从哪里开始,我不认为这是有道理开始与复杂的东西然后不理解任何东西,只复制。 当我变得更实际时,最好从简单而复杂的工作中,对吗?

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


我跟着Fredrik的教程,这就是我的got。 阅读的代码,我看到:

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

所以当玩家撞到了硬币,硬币应该不会被破坏?但在我的情况是不是这样..

+1

我一直感兴趣的同样的事情,但我看到有人建议首先学习Java或C/C++的Flash游戏,我想看看人们回答的问题 – jhhoff02

+1

从简单的开始就很好,我想你可能运气更好找到[http: //gamedev.stackexchange.com/](http://gamedev.stackexchange.com/) – Catwood

+0

这是一个非常广泛的问题,需要一个非常深刻的答案。正如上面的评论所述,它可能更适合在另一个论坛,但我我会一起写一些东西让你开始!坚持 – Maakep

回答

6

这不是正确的论坛这个问题,但我在心情回答,所以我会。我希望它能帮助你,即使它被标记出来,呵呵。

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

玩家

  • 与物理(刚体组件)
  • 和碰撞(专栏对撞机部件)
  • 左/右运动和跳跃(代码)
  • 可以检测触发器,如通电/尖峰/水平结束(代码)

平地对象

  • 用对撞机(所以玩家可以在上面行走)(专栏撞机部件)

皮卡

  • 与触发对撞机(所以玩家可以穿过他们&检测它们)(箱对撞组件)

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

  • 首先,让我们创造我们GameObjects。 GameObjects是游戏中的每一个对象,都是通过右键单击层次结构(默认情况下,您的主摄像头)创建的,然后单击“创建空白”。但由于这是一款2D游戏,我们希望每个对象都是一个Sprite;一个图像。因此,不要点击“创建空白”,点击“2D对象 - >雪碧”。这将是我们的玩家。现在玩家看起来并不像什么,因为没有图像可以代表它。将所选图像拖到统一资产文件夹中的某个位置,然后将导入的图像拖到精灵的精灵字段中,以更改此项。像这样的:http://i.imgur.com/6cKQCss.gifv

  • 添加组件(就像这样:http://i.imgur.com/UkkxbgK.png盒撞机Rigidbody2d,并呼吁像... “播放器” 的新C#脚本。来吧,与预先存在的“播放器”标签标记我们的玩家游戏物体,并在刚体组件约束倍下,选中“冻结旋转:Z”见图片:http://i.imgur.com/be6G2pB.png

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

  • 这里是播放器脚本。可能会有一些错误(例如,即使不在地面上,玩家也可以永远跳跃),尝试修复它们,或者改善它,如果它不够好。它需要玩家有Rigidbody2D - & Collider2D -component (一对撞机部件可以是一个盒子撞机,对撞机circel等等等任何形状),这是我们在最后一步增加。该Rigidbody2d给玩家物理(重力下降,受此影响被迫)和撞机给它的能力,碰撞的事情。如果没有这个,玩家只会掉落地面,无法检测是否触及其他触发器/对撞机。

这是一个C#-cript,我建议您使用它。它非常类似于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对象 - > Sprite”并将其命名为“Floor”(或其他)。如果你想看到它,就像我们对玩家做的那样给它一个精灵! (再次使用gif:http://i.imgur.com/6cKQCss.gifv)给这个块添加一个“Box Collider 2D”组件。玩家现在可以站在这些物体上。你现在可以继续运行游戏,你应该可以有一个(有点)功能的玩家和对象让玩家站在上面。在其Transform组件中更改其值以更改其大小属性。如果您需要更多(您将会),您可以复制并粘贴此对象。还有一种叫做“预制”的东西。这就像保存一个游戏对象,所以你可以多次使用它,并有更多的好处,你会稍后意识到。要将GameObject作为预制件保存,只需将对象从游戏层次结构拖放到Projects Assets文件夹中的某个位置(就像我们用sprites做的那样)。

  • 对于硬币,做同样的事情,但给它一个新的标签(如何创建新的标签:http://i.imgur.com/dYt9b0T.gifv)称为“硬币”,并在框中Colldier 2D部件,检查“为触发”按钮。这会让我们在进入时触发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是您想要的组件,就像我们在rb = GetComponent<Rigidbody>();的Player-script中所做的那样。

现在做这个例子,展开它,google“Unity如何...“如果您需要任何帮助或要求在这里,如果你不能得到它的工作。

快乐Unitying!哦,问的路程,如果你对我的回答了问题。

+2

我有一个问题:我怎么能给你这个业力/赏金点? – jhhoff02

+1

不错的答案。我认为如果他遵循Unity的2D项目教程的[one](https://unity3d.com/learn/tutorials),Op就会好起来。 @ jhhoff02你可以在3天左右之后,但不是今天。 – Programmer

+0

哈哈,您的欣赏就是我需要的!喜欢写它,尽管我不得不在最后冲上去。干杯! – Maakep