在 Unity 中创建基本的 2D 平台游戏
Create a basic 2D platformer game in Unity
我对 Unity 知之甚少,想创建一个非常简单的平台 2D 游戏,只需使用基本形状(正方形、矩形、圆形等)。
我在网上搜索了一下,找到了一个更复杂的教程。
例如,我看到了this,但它的目标比我的更远大
(我也看过其他教程,但我不能添加额外的链接)。
我很想创建一些非常简单的东西来理解程序的基础知识,然后尝试放置一些我制作的更复杂的东西。
有人对我有什么建议吗?
这是我想象中的第一关,真的很简单(也很丑):
我不知道从何说起,我认为从复杂的东西开始然后什么都不懂只复制是没有意义的。
当我变得更实际时,最好从简单和复杂的工作开始,对吗?
我补充说我知道 Java 和一点 JavaScript。
我遵循了 Fredrik 的教程,这就是我的 got。
阅读代码,我看到了这个:
if(col.tag == "Coin") {
coins++;
Destroy(col.gameObject); // remove the coin
}
所以当玩家碰撞到硬币时,硬币应该不会被破坏?但在我的情况下不是那样的..
对于这个问题,这不是一个合适的论坛,但我很想回答,所以我会的。希望能帮到你,就算被举报了,呵呵。
因此,对于简单的 2D 平台游戏,您需要:
一个玩家
- 物理(刚体组件)
- 和collisions(Box collider组件)
- 具有left/right移动和跳跃(代码)
- 可以检测触发器,例如powerups/spikes/level结束(代码)
水平物体
- 带有碰撞器(这样玩家就可以在上面行走)(盒子碰撞器组件)
皮卡
- 带有触发碰撞器(因此玩家可以通过它们并检测它们)(盒子碰撞器组件)
通过启动的Unity创建一个新的2D项目。 检查 2D 按钮。
首先,让我们创建我们的 GameObjects。游戏对象是游戏中的每个对象,通过在层次结构中单击鼠标右键(默认情况下主摄像机所在的位置)并单击“创建空”来创建。但由于这是一个 2D 游戏,我们希望每个对象都是 Sprite;一个图像。因此,不要单击“创建空”,单击“2D 对象 -> Sprite”。这将是我们的播放器。现在播放器看起来不像任何东西,因为没有图像来表示它。通过将您选择的图像拖到统一资产文件夹中的某个位置,然后将该导入的图像拖到精灵上的精灵字段来更改此设置。像这样:http://i.imgur.com/6cKQCss.gifv
添加组件(像这样:http://i.imgur.com/UkkxbgK.png) Box Collider, Rigidbody2d and a new C# script called something like... "Player". Go ahead and tag our player gameobject with the pre-existing "Player" tag and, in the Rigidbody components constraint-fold down, check "Freeze Rotation: Z" See image: http://i.imgur.com/be6G2pB.png
您的播放器现在应该看起来像这样 http://i.imgur.com/be6G2pB.png(+ 播放器脚本)
- 播放器脚本来了。可能存在一些错误(例如,玩家可以永远跳跃,即使不在地面上),如果有则尝试修复它们,或者如果效果不够好则进行改进。它要求玩家有一个 Rigidbody2D- & Collider2D-component (collider component can be a box collider, circel collider等等等等。任何形状),我们在最后一步添加的。 Rigidbody2d 为玩家提供 physics(重力下落,受强制影响),collider 提供它与事物碰撞的能力。如果没有这个,玩家只会从地面掉落并且无法检测到它是否接触到其他 triggers/colliders.
这是我推荐您使用的 C# 脚本。它与 java 非常相似并且很容易上手。反正大部分都是unity-specific:
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,这样您就可以多次使用它,而且您以后会发现它有更多的好处。要将游戏对象保存为预制件,只需将对象从游戏层次结构中拖到项目资产文件夹中的某个位置(就像我们对精灵所做的那样)。
对于Coins,做同样的事情但是给它一个新标签(如何创建新标签:http://i.imgur.com/dYt9b0T.gifv)叫做“Coin”在 Box Colldier 2D 组件中,选中“Is Trigger” 按钮。这将使它在我们走进它时触发 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,其中包含对象的位置、旋转和缩放。修改这些(在脚本中:transform.position、transform.rotation、transform.localScale)以修改...嗯,上述属性。
要在代码中获取组件,您需要使用 GetComponent();其中 Component 是您想要的组件,就像我们在 Player-script 中使用 rb = GetComponent<Rigidbody>();
.
所做的那样
现在做这个示例,扩展它,google“Unity 如何...”如果您需要任何帮助或在这里询问您是否无法让它工作。
团结快乐!哦,如果你对我的回答有疑问,请问。
我对 Unity 知之甚少,想创建一个非常简单的平台 2D 游戏,只需使用基本形状(正方形、矩形、圆形等)。 我在网上搜索了一下,找到了一个更复杂的教程。
例如,我看到了this,但它的目标比我的更远大 (我也看过其他教程,但我不能添加额外的链接)。
我很想创建一些非常简单的东西来理解程序的基础知识,然后尝试放置一些我制作的更复杂的东西。 有人对我有什么建议吗?
这是我想象中的第一关,真的很简单(也很丑):
我不知道从何说起,我认为从复杂的东西开始然后什么都不懂只复制是没有意义的。 当我变得更实际时,最好从简单和复杂的工作开始,对吗?
我补充说我知道 Java 和一点 JavaScript。
我遵循了 Fredrik 的教程,这就是我的 got。 阅读代码,我看到了这个:
if(col.tag == "Coin") {
coins++;
Destroy(col.gameObject); // remove the coin
}
所以当玩家碰撞到硬币时,硬币应该不会被破坏?但在我的情况下不是那样的..
对于这个问题,这不是一个合适的论坛,但我很想回答,所以我会的。希望能帮到你,就算被举报了,呵呵。
因此,对于简单的 2D 平台游戏,您需要:
一个玩家
- 物理(刚体组件)
- 和collisions(Box collider组件)
- 具有left/right移动和跳跃(代码)
- 可以检测触发器,例如powerups/spikes/level结束(代码)
水平物体
- 带有碰撞器(这样玩家就可以在上面行走)(盒子碰撞器组件)
皮卡
- 带有触发碰撞器(因此玩家可以通过它们并检测它们)(盒子碰撞器组件)
通过启动的Unity创建一个新的2D项目。 检查 2D 按钮。
首先,让我们创建我们的 GameObjects。游戏对象是游戏中的每个对象,通过在层次结构中单击鼠标右键(默认情况下主摄像机所在的位置)并单击“创建空”来创建。但由于这是一个 2D 游戏,我们希望每个对象都是 Sprite;一个图像。因此,不要单击“创建空”,单击“2D 对象 -> Sprite”。这将是我们的播放器。现在播放器看起来不像任何东西,因为没有图像来表示它。通过将您选择的图像拖到统一资产文件夹中的某个位置,然后将该导入的图像拖到精灵上的精灵字段来更改此设置。像这样:http://i.imgur.com/6cKQCss.gifv
添加组件(像这样:http://i.imgur.com/UkkxbgK.png) Box Collider, Rigidbody2d and a new C# script called something like... "Player". Go ahead and tag our player gameobject with the pre-existing "Player" tag and, in the Rigidbody components constraint-fold down, check "Freeze Rotation: Z" See image: http://i.imgur.com/be6G2pB.png
您的播放器现在应该看起来像这样 http://i.imgur.com/be6G2pB.png(+ 播放器脚本)
- 播放器脚本来了。可能存在一些错误(例如,玩家可以永远跳跃,即使不在地面上),如果有则尝试修复它们,或者如果效果不够好则进行改进。它要求玩家有一个 Rigidbody2D- & Collider2D-component (collider component can be a box collider, circel collider等等等等。任何形状),我们在最后一步添加的。 Rigidbody2d 为玩家提供 physics(重力下落,受强制影响),collider 提供它与事物碰撞的能力。如果没有这个,玩家只会从地面掉落并且无法检测到它是否接触到其他 triggers/colliders.
这是我推荐您使用的 C# 脚本。它与 java 非常相似并且很容易上手。反正大部分都是unity-specific:
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,这样您就可以多次使用它,而且您以后会发现它有更多的好处。要将游戏对象保存为预制件,只需将对象从游戏层次结构中拖到项目资产文件夹中的某个位置(就像我们对精灵所做的那样)。
对于Coins,做同样的事情但是给它一个新标签(如何创建新标签:http://i.imgur.com/dYt9b0T.gifv)叫做“Coin”在 Box Colldier 2D 组件中,选中“Is Trigger” 按钮。这将使它在我们走进它时触发 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,其中包含对象的位置、旋转和缩放。修改这些(在脚本中:transform.position、transform.rotation、transform.localScale)以修改...嗯,上述属性。
要在代码中获取组件,您需要使用 GetComponent();其中 Component 是您想要的组件,就像我们在 Player-script 中使用 rb = GetComponent<Rigidbody>();
.
现在做这个示例,扩展它,google“Unity 如何...”如果您需要任何帮助或在这里询问您是否无法让它工作。
团结快乐!哦,如果你对我的回答有疑问,请问。