《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转
4 坦克移动和旋转
本节课的目标是实现同时wsad和上下左右控制两个坦克分别移动和旋转
4.1 本节代码预览
将上节课场景s2另存为s3.
4.2 添加车轮扬沙效果
从Prefabs里面找到DustTrail,拖放到Tank里面
单击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
将默认脚本名称改为TankMove,注意大小写.
实现坦克移动和旋转有很多方法,这里介绍两种:使用transform和rigidbody.
4.4 使用transform移动和旋转(TankMove.cs)
TankMove.cs代码如下:
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脚本
运行游戏,就能看到坦克在原地绕圈.
4.5 使用rigidbody移动和旋转(TankMoveRB.cs)
刚体有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设置
a/d对应Horizontal1,ws对应Vertical1
在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脚本,去掉其他脚本.
点击Prefab最右边的Apply保存预设体.
然后从wm/prefabs中拖放Tank到Hierarchy里面
改为Tank2,设置坐标为(5,0,0)
这时候我们有了两个Tank,点击运行.
然后我们会发现这时候两个Tank是一起运动和旋转的.
而我们最终实现的效果应该是两个坦克分别控制的,这时候我们再来看一下Input的设置
里面专门为两个坦克设置了不同的Axis,以1和2作为区分,那么问题来了,如何利用这一点呢?
这时候我们就要想到我们现在的脚本里是写死了Axis的,现在只需要能随意更改1或者2就可以了.
所以这时候我们就需要声明一个变量id来区别到底是哪个坦克.
这样我们就把两个坦克区分开了.
下面是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
这时候我们就实现了两个坦克的分别控制
本节内容到此结束,希望通过本节内容大家可以加深对于变量的理解和应用.
---------------------------我是目录分割线---------------------------
《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转
《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力
《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制
---------------------------我是目录分割线---------------------------
《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转的更多相关文章
- 《杜增强讲Unity之Tanks坦克大战》10-相机控制
10 相机控制 本节主要学习如何控制相机自动调整位置和焦距,使两个坦克一直同时在视野内. image 在Hierarchy点击右键 image 点击 Create Empty,生成空对象,改名 ...
- 《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制
11 游戏流程控制 使用协程来控制游戏流程 11.1 添加MessageText 首先添加一个Text来显示文字 image 设置GameMgr image 11.2 游戏整体流程 下面Gam ...
- 《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力
9 发射子弹时蓄力 实现效果如下 image 按下开火键(坦克1为空格键)重置力为最小力,一直按着的时候蓄力,抬起的时候发射.如果按着的时候蓄力到最大,则自动发射,此时在抬起则不会重复发射. 首先 ...
- 《杜增强讲Unity之Tanks坦克大战》1-准备工作
0.案例介绍 0.1开始界面 点击Play Now 进入游戏界面 左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火 右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...
- 《杜增强讲Unity之Tanks坦克大战》2-场景设置
2 场景设置 2.1 本节效果预览 2.2 项目目录设置 点击Project面板的Create按钮,在根目录下面新建wm文件夹 Wm文件夹用于存放我们自己生成的Prefab和脚本等其他资源, ...
- 《杜增强讲Unity之Tanks坦克大战》3-添加坦克
3 添加坦克 3.1 本节效果预览 3.2 另存新场景 首先打开上次的场景s1,另存为s2,放到同一个文件夹下面. 3.3 添加坦克模型 在Model文件夹下面找到Tank模型 将Tank ...
- 《杜增强讲Unity之Tanks坦克大战》5-子弹
5 子弹 本节的任务是创建子弹的Prefab image 首先从Model/Shell找到子弹的模型,拖入Hierarchy中,添加刚体组件,所有属性默认值. 添加Capsule Collider ...
- 《杜增强讲Unity之Tanks坦克大战》6-发射子弹
6 发射子弹 本节完成发射子弹的功能,最终代码如下: image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...
- 《杜增强讲Unity之Tanks坦克大战》7-坦克血条
7 坦克血条 点击菜单GameObject->UI->Slider创建Slider 选中EventSystem,设置Horizontal Axis为HorzontalUI,Vertic ...
随机推荐
- JVM & GC 笔记
0. 说明 转载并修改自JVM 1. JVM 1.1 什么是JVM JVM为Java虚拟机(Java Virtual Machine) Runtime data area,运行时数据区. 包含5个区域 ...
- Android高级_第三方下载工具Volley
Volley下载主要应用于下载文本数据和图片数据两个方向,下面分别介绍: 一.使用Volley开启下载,首先要做的是导包和添加权限: (1)在build.gradle文件中导入依赖包:compile ...
- [PC]可用于Windows Server 2008 R2的Xbox One手柄、接收器驱动
让客厅里的Gen8可以玩FC和PS1游戏,折腾了半天,终于将Xbox One手柄驱动弄好: http://www.drvsky.com/Microsoft/Xbox_One.htm http://ww ...
- python(set、dict)
一.集合 它的元素是唯一的,并无序的. 1.集合定义 s = set() s = {1, 2, 3} 2.集合的方法 update版本的集合运算是在原集合上进行修改,返回值为None. add()表示 ...
- T4学习- 2、创建设计时模板
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的关键 ...
- JavaScript利用Date实现简单的倒计时实例
介绍 Date对象,是操作日期和时间的对象.Date对象对日期和时间的操作只能通过方法.Date在js中和Array类似,都是拥有自己的特殊方法的特殊对象. 创建 Date 对象的语法: var my ...
- SAP客户端 测试机、开发机、生产机
SAP客户端 测试机.开发机.生产机 客户端(即Client),是SAP组织架构里最高层的组织单元,所有数据,包括静态数据(科目.客户.供应商.物料.资产等).业务数据(采购订单.销售订单. ...
- 使用Winform程序作为WCF服务的宿主
如果我们自己新建一个WCF服务库,生成了dll文件.那我们需要创建一个宿主程序,在本例中我们新建一个Winform程序作为WCF的宿主程序. 在网上很多教程里对创建过程写的很模糊,错误也很多.本文是作 ...
- [USACO2004OPEN]Cave Cows 3
嘟嘟嘟 看完题后突然想起jf巨佬的话:"看到曼哈顿距离就想转切比雪夫距离." 于是我就转换了一下. 然后问题变成了求 \[max_{i, j \in n} \{ max \{ |x ...
- Python3与Python2的差异
基于python3浅谈python3与python2的差异.由于现今主流Python3,但是之前用Python2做的项目,还得维护,所以作为python工作者,不免要了解其中差异,其中,Python2 ...