《Unity入门案例-Tanks坦克大战》4-坦克的移动和旋转

4 坦克移动和旋转

本节课的目标是实现同时wsad和上下左右控制两个坦克分别移动和旋转

4.1 本节代码预览

image

将上节课场景s2另存为s3.

4.2 添加车轮扬沙效果

从Prefabs里面找到DustTrail,拖放到Tank里面

image

单击DustTrail,改为LeftDustTrail,设置坐标为(-0.5,0,-0.75)

在Hierarchy里面使用快捷键Ctrl+D,复制LeftDustTrail,改为RightDustTrail,

设置坐标为(0.5,0,-0.75)

4.3 添加脚本

首先在Project面板中选中wm/Scripts文件夹,右键弹出新建菜单,选择

Create->C# Script

image

将默认脚本名称改为TankMove,注意大小写.

image

实现坦克移动和旋转有很多方法,这里介绍两种:使用transform和rigidbody.

4.4 使用transform移动和旋转(TankMove.cs)

TankMove.cs代码如下:

image

Transform有Translate()方法实现位置的移动,Rotate()方法实现旋转.

首先我们声明两个速度变量moveSpeed 和 turenSpeed

public float moveSpeed = 5; // 移动速度

public float turnSpeed = 90; // 旋转速度

在Update() 里面循环执行移动和旋转

void Update () {

    transform.Translate (Vector3.forward * moveSpeed * Time.deltaTime);// 移动

    transform.Rotate (transform.up * turnSpeed * Time.deltaTime);// 旋转

}

完整代码:

using UnityEngine;

using System.Collections;

public class TankMove : MonoBehaviour {

public float moveSpeed = 5; // 移动速度

public float turnSpeed = 90; // 旋转速度

// Update is called once per frame

void Update () {       

    transform.Translate (Vector3.forward * moveSpeed * Time.deltaTime);// 移动

    transform.Rotate (transform.up * turnSpeed * Time.deltaTime);// 旋转

}       

}

为坦克挂载TankMove脚本

image

运行游戏,就能看到坦克在原地绕圈.

image

4.5 使用rigidbody移动和旋转(TankMoveRB.cs)

image

刚体有MovePosition方法可以实现刚体的移动,MoveRotation可以实现刚体的旋转.

最终代码如下:

using UnityEngine;

using System.Collections;

public class TankMoveRB : MonoBehaviour {

public float moveSpeed = 5; // 移动速度

public float turnSpeed = 90; // 旋转速度( 每秒90度)

private Rigidbody rb ; // 刚体组件

// Use this for initialization

void Start () {

    rb = GetComponent<Rigidbody> (); // 获取刚体组件

}

// Update is called once per frame

void FixedUpdate () {

    Vector3 movement = transform.forward * moveSpeed * Time.deltaTime;

    rb.MovePosition (transform.position + movement); // 移动到新坐标

    Quaternion turn = Quaternion.Euler (0, turnSpeed * Time.deltaTime, 0);

    rb.MoveRotation (rb.rotation * turn); // 旋转到新角度

}

}

4.6 添加键盘控制

使用菜单打开Input设置

image
image

a/d对应Horizontal1,ws对应Vertical1

image

在Update里面获取水平和垂直变量

private float moveInputValue = 0; // 移动输入变量

private float turnInputValue = 0; // 旋转输入变量

void Update(){

    moveInputValue = Input.GetAxis ("Vertical1");

    turnInputValue = Input.GetAxis ("Horizontal");   

}

然后将这两个变量当成参数乘到移动速度和旋转速度里面

Vector3 movement = transform.forward * moveSpeed * Time.deltaTime * moveInputValue ;

    rb.MovePosition (transform.position + movement); // 移动到新坐标

    Quaternion turn = Quaternion.Euler (0, turnSpeed * Time.deltaTime * turnInputValue , 0);

    rb.MoveRotation (rb.rotation * turn); // 旋转到新角度

TankMoveByKeyboad.cs全部代码:

using UnityEngine;

using System.Collections;

public class TankMoveByKeyboard : MonoBehaviour {

public float turnSpeed = 180; // 旋转速度( 每秒180度)

public float moveSpeed = 15; // 移动速度

private float moveInputValue = 0; // 移动输入变量

private float turnInputValue = 0; // 旋转输入变量

private Rigidbody rb ; // 刚体组件

// Use this for initialization

void Start () {

    rb = GetComponent<Rigidbody> (); // 获取刚体组件

}

// Update is called once per frame

void Update(){

    moveInputValue = Input.GetAxis ("Vertical1");

    turnInputValue = Input.GetAxis ("Horizontal1");   

}

// Update is called once per frame

void FixedUpdate () {

    Vector3 movement = transform.forward * moveSpeed * Time.deltaTime * moveInputValue ;

    rb.MovePosition (transform.position + movement); // 移动到新坐标

    Quaternion turn = Quaternion.Euler (0, turnSpeed * Time.deltaTime * turnInputValue , 0);

    rb.MoveRotation (rb.rotation * turn); // 旋转到新角度

}

}

4.7 区分坦克

将坦克的挂载TankMoveByKeyboard脚本,去掉其他脚本.

image

点击Prefab最右边的Apply保存预设体.

然后从wm/prefabs中拖放Tank到Hierarchy里面

改为Tank2,设置坐标为(5,0,0)

image

这时候我们有了两个Tank,点击运行.

然后我们会发现这时候两个Tank是一起运动和旋转的.

image

而我们最终实现的效果应该是两个坦克分别控制的,这时候我们再来看一下Input的设置

image

里面专门为两个坦克设置了不同的Axis,以1和2作为区分,那么问题来了,如何利用这一点呢?

这时候我们就要想到我们现在的脚本里是写死了Axis的,现在只需要能随意更改1或者2就可以了.

image

所以这时候我们就需要声明一个变量id来区别到底是哪个坦克.

image

这样我们就把两个坦克区分开了.

下面是TankMoveByKeyboard2.cs的完整代码:

using UnityEngine;

using System.Collections;

public class TankMoveByKeyboard2 : MonoBehaviour {

public float turnSpeed = 180; // 旋转速度( 每秒180度)

public float moveSpeed = 15; // 移动速度

private Rigidbody rb ; // 刚体组件

private float moveInputValue = 0; // 移动输入变量

private float turnInputValue = 0; // 旋转输入变量

public int id = 1; // tank id

// Use this for initialization

void Start () {

    rb = GetComponent<Rigidbody> (); // 获取刚体组件

}

void Update(){

    moveInputValue = Input.GetAxis ("Vertical" + id);

    turnInputValue = Input.GetAxis ("Horizontal" + id);   

}

// Update is called once per frame

void FixedUpdate () {

    Vector3 movement = transform.forward * moveSpeed * Time.deltaTime * moveInputValue ;

    rb.MovePosition (transform.position + movement); // 移动到新坐标

    Quaternion turn = Quaternion.Euler (0, turnSpeed * Time.deltaTime * turnInputValue , 0);

    rb.MoveRotation (rb.rotation * turn); // 旋转到新角度

}

}

将Tank上挂载的脚步更改为TankMoveByKeyboard2 ,Apply prefab.

Tank id设置为1,Tank2id设置为2

image
image

这时候我们就实现了两个坦克的分别控制

本节内容到此结束,希望通过本节内容大家可以加深对于变量的理解和应用.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容