这不是这个问题的正确论坛,但我有心情回答,所以我会的。希望能帮到你,就算被举报了,呵呵。
因此,对于您的简单 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.png)Box Collider、Rigidbody2d 和一个新的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<Rigidbody>(); 所做的那样。
现在做这个例子,展开它,如果你需要任何帮助,谷歌“Unity 如何...”,或者如果你不能让它工作,请在这里询问。
团结愉快!哦,如果你对我的回答有任何疑问,那就问吧。