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

bet*_*eth 4 unity-game-engine 2d-games

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

例如,我看到了这个,但它的目标比我的更有野心(我也看过其他教程,但我不能添加其他链接).

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

这是我想象的第一级,非常简单(而且丑陋):
第一级

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

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


我遵循Fredrik的教程,这就是我得到的.阅读代码,我看到了这个:

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

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

Fre*_*hön 11

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

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

一个玩家

  • 与物理(刚体组件)
  • 和碰撞(Box collider组件)
  • 左/右移动和跳跃(代码)
  • 可以检测诸如通电/尖峰/电平结束(代码)之类的触发

水平地面物体

  • 与对撞机(所以玩家可以在它上面行走)(Box collider组件)

拾音器

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

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

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

  • 添加组件(像这样:http://i.imgur.com/UkkxbgK.png)Box Collider,Rigidbody2d和一个名为......"Player" 的新C#脚本.继续使用预先存在的"Player"标签标记我们的玩家游戏对象,并在Rigidbody组件约束中向下折叠,选中"Freeze Rotation:Z"参见图像:http://i.imgur.com/be6G2pB.png

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

  • 这是播放器脚本.可能存在一些错误(例如,玩家可以永远跳跃,即使不在地面上),如果存在则尝试修复它们,或者如果它不能正常工作则进行改进.它需要玩家具有Rigidbody2D - &Collider2D -component (一对撞机组分可以是框撞机,circel撞机等等.任何形状),这是我们在最后步骤中加入.该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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对于Coins,做同样的事情,但给它一个新标签(如何创建新标签:http://i.imgur.com/dYt9b0T.gifv)称为"Coin",在Box Colldier 2D组件中,检查"是"触发"按钮.当我们走进它时,它会触发OnTriggerEnter2D并且玩家无法站在它上面; 我们将直接通过它(因为它只是一个触发器).我们将使用Tag名称来识别播放器中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!
    *
    */
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

现在做这个例子,展开它,google"Unity how to ..."如果你需要任何帮助,或者在这里询问你是否无法让它工作.

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

  • 我有一个问题:我怎么能给你业力/赏金点呢? (2认同)