AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Unity3D

Unity 2D 坦克游戏教程(3):让坦克动起来

51自学网 2014-05-24 http://www.51zixue.net

确保在项目的Asset文件夹下双击“Tank”场景来获得当前工作版本。点此下载第三部分的工程文件:让坦克动起来

本篇教程将涉及:

  • 给2D 坦克sprite添加动作
  • 添加一个地形背景层
  • 给坦克添加个GroundDetector
  • 基本的脚本

一些基本的脚本

脚本能给GameObjects添加行为。我们先创建一个简单的C#坦克控制器脚本让坦克移动起来。在Project面板下点击“Create”下拉菜单,如下图:

这将会生成一个空的脚本,选择该脚本将其重命名为“TankController.”,你应该看到如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;
using System.Collections;
 
public class TankController : MonoBehaviour {
 
// Use this for initialization
void Start () {
 
}
 
// Update is called once per frame
void Update () {
 
}
}

这个并不能让坦克很好地移动起来,所以加上一点移动和跳跃的逻辑(参考了Unity 2D demo 项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using UnityEngine;
using System.Collections;
 
public class TankController : MonoBehaviour {
 
[HideInInspector]
public bool jump = false;
 
public float moveForce = 365f;
public float maxSpeed = 5f;
public float jumpForce = 1000f;
 
private Transform groundDetector;
private bool grounded = false;
 
void Awake()
{
// Setting up references.
groundDetector = transform.Find("GroundDetector");
}
 
void Update()
{
// The player is grounded if a linecast to the groundcheck position hits anything on the ground layer.
grounded = Physics2D.Linecast(transform.position, groundDetector.position, 1 << LayerMask.NameToLayer("Terrain"));
 
// If the jump button is pressed and the player is grounded then the player should jump.
if(Input.GetButtonDown("Jump") && grounded)
jump = true;
}
 
void FixedUpdate ()
{
// Cache the horizontal input.
float h = Input.GetAxis("Horizontal");
 
if(h * rigidbody2D.velocity.x < maxSpeed)
rigidbody2D.AddForce(Vector2.right * h * moveForce);
if(Mathf.Abs(rigidbody2D.velocity.x) > maxSpeed)
rigidbody2D.velocity = new Vector2(Mathf.Sign(rigidbody2D.velocity.x) * maxSpeed, rigidbody2D.velocity.y);
 
// If the player should jump...
if(jump)
{
rigidbody2D.AddForce(new Vector2(0f, jumpForce));
jump = false;
}
}
}

这样就有了一个新的动作脚本,我们还必须修改一下Unity游戏场景。

添加一个GroundDetector

我有提过这个坦克是可以跳跃的吗?

现在需要添加一个“GroundDetector”,用来决定坦克是否接触到了地面。

这个地面监测器将是一个空的GameObject(由一个“transform”组件和一个红色的椭圆形占位符组成)。最终用户将无法看到这个对象,但是在代码中是很有用的。

创建一个空的GameObject(GameObject -> Create Empty)。选择新创建的这个空GameObject,在Inspector窗口中重命名为“GroundDetector”,并选择红色的圆形轮廓(这能更清楚地看到游戏场景)。

把GroundDetector移动到坦克 GameObject的底部,完成图应该是下面这个样子的。我在底部空余了一些地方,用来给报错提供空间。

在完成之前还有一个更小的任务,把“Terrain”添加到“Terrain Layer.”上。在Unity的主窗口右上角选择“Layers-> Edit Layers”。

在Unity里,层有利于把GameObject分类,确定碰撞如何解决。如果我们有一些从不与其他东西互动的背景游戏对象(比如云或者风景元素),我们可以简单地把那些对象移动到“Scenery”层,把它们给弄出来。

在 “Edit Layers”菜单式, 添加 “Terrain”层是下面这个样子的。

接下来,点击“Terrain”对象,设置它的图层为“Terrain”

现在点击“Play”,你将会看到如下场景,通过控制左右箭头键控制坦克。(下图为截图,在Unity web player中查看请点击原文Making Your Tank Move

坦克静止时

使用左右箭头键控制坦克时,坦克会发生翻车现象

这做的还不够理想,我们还得修改一下坦克的物理行为,让它变得协调一点。

  • 把坦克质量改为20
  • 最大速度改为5
  • 跳跃力改为5000
  • 设置2D 对撞机的中心Y值为“-0.4”
  • 设置2D 对撞机的的尺寸Y值为“0.2”

结果看起来应该是这个样子:

坦克静止时

控制坦克移动时坦克沿着地面前进,不会翻车。

接下来

我将会把坦克切割成几个部分,这样就可以做一些事情,例如动画炮塔指向鼠标光标。


建议使用电驴(eMule)下载分享的资源。

说明
:本教程来源互联网或网友分享或出版商宣传分享,仅为学习研究或媒体推广,51zixue.net不保证资料的完整性。
 
上一篇:Unity 2D 坦克游戏教程(2):2D 地形和对撞机  下一篇:Unity 2D 坦克游戏教程(4):坦克粘接