确保在项目的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 {
void Start () {
}
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()
{
groundDetector = transform.Find( "GroundDetector" );
}
void Update()
{
grounded = Physics2D.Linecast(transform.position, groundDetector.position, 1 << LayerMask.NameToLayer( "Terrain" ));
if (Input.GetButtonDown( "Jump" ) && grounded)
jump = true ;
}
void FixedUpdate ()
{
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 (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)下载分享的资源。
说明:本教程来源互联网或网友分享或出版商宣传分享,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
|