1. 案例简述

这个案例实现一个简单的坦克对战游戏,两个玩家在一个地图上PK。

2. 控制坦克移动

与案例一中小球的移动方式不同,坦克在横向上不能是平移,因此横向按键控制的应该是坦克旋转。

public float speed = 5;//前进速度
public float angularSpeed = 5;//旋转速度
private Rigidbody rd; void Start () {
rd = this.GetComponent<Rigidbody> ();
} void FixedUpdate(){
float v = Input.GetAxis ("VerticalPlayer" + number);//自定义虚拟轴
rd.velocity = transform.forward * v * speed;//根据情况需要在刚体组件Constraints冻结相应position或rotation float h = Input.GetAxis ("HorizontalPlayer" + number);
rd.angularVelocity = transform.up * h * angularSpeed;
}

(1)与Update()不同,Update()方法是游戏每渲染一帧调用一次,调用的频率会受机器影响,而FixedUpdate()是每隔一定时间间隔调用一次,调用的频率不受机器影响。因此,为了得到更逼真的物理效果,在模拟物理运动时,一般选择在FixedUpdate()中。

(2)由于游戏中有两个玩家,asdw和方向键需要控制两个不同角色,因此需要自定义虚拟轴,位置是:Edit->Project Setting->Input。

(3)根据实际情况,需要在刚体组件中的Constraints进行相应的Freeze操作。

3. 控制子弹发射

public class TankAttack : MonoBehaviour {

	public GameObject shellPrefab;//子弹的预设
public KeyCode fireKey = KeyCode.Space;//发射子弹的按键
public float shellSpeed = 15;//子弹射出速度
private Transform firePosition;//发射子弹的位置 void Start () {
firePosition = transform.Find ("FirePosition");
} void Update () {
if (Input.GetKeyDown(fireKey)) {
GameObject go = GameObject.Instantiate (shellPrefab, firePosition.position, firePosition.rotation) as GameObject;//生成子弹
go.GetComponent<Rigidbody> ().velocity = go.transform.forward * shellSpeed;//发射子弹
}
}
}

生成子弹的位置是坦克炮筒处,因此在该处新建一个空对象,调整其旋转角度,这个对象的transform即可作为生成子弹的transform。

public class Shell : MonoBehaviour {

	public GameObject shellExplosionPrefab;

	...

	void OnCollisionEnter(Collision collision){
GameObject.Instantiate (shellExplosionPrefab, transform.position, transform.rotation);
GameObject.Destroy (this.gameObject);//若传入参数为this,则值销毁当前脚本而非游戏对象
}
}

对子弹进行碰撞检测(触发检测也可以,区别在于爆炸前有无撞击效果),当子弹击中物体时即在当前位置生成爆炸特效,同时销毁子弹对象。

public class DestroyForTime : MonoBehaviour {

	public float time;//在检视面板传入该特效的播放时长

	void Start () {
Destroy (this.gameObject, time);//播放完毕后销毁
}
}

给爆炸特效增加脚本,当特效播放完毕后销毁对象。

4. 子弹击中坦克产生伤害

在子弹击中坦克后,主要处理在坦克的生命值上,因此在子弹的碰撞检测中发送消息,而后在坦克中进行处理。

if (collision.collider.tag == "Tank") {
collision.collider.SendMessage ("TakeDamage");//若击中坦克,则发送消息
}

给坦克增加一个单独的脚本进行生命值的控制:

public class TankHealth : MonoBehaviour {

	public GameObject tankExposionPrefab;
public int health = 100; void TakeDamage(){
health -= Random.Range (10, 20);
if (health <= 0) {
GameObject.Instantiate (tankExposionPrefab, this.transform.position, this.transform.rotation);
GameObject.Destroy (this.gameObject);
}
}
}

5. 双主角的情况下控制相机跟随、视野缩放

public class FollowTarget : MonoBehaviour {

	public Transform player1;
public Transform player2; private Camera camera;
private Vector3 offset; void Start () {
camera = this.GetComponent<Camera> ();
offset = transform.position - (player1.position + player2.position) / 2;
} void Update () {
transform.position = (player1.position + player2.position) / 2 + offset;
float distance = Vector3.Distance (player1.position, player2.position);
float size = distance;
camera.orthographicSize = size;//让正交相机视野实时改变
}
}

(1)双角色的相机跟随本质上与单角色没太大区别,只是将视点定在两个角色的中心点,通过中心点计算相机的偏移量,实时更新相机的position。

(2)视野的缩放则是利用了正交相机的size与两个角色之间的距离之比进行更改,案例中两角色之间初始距离为10,相机size为10,因此比例为1,所以直接让size = distance。

6. 控制声音播放

AudioSource.PlayClipAtPoint (tankExposionAudio, this.transform.position);

第一种方法,播放获得的AudioClip对象,第一个参数为AudioClip对象,第二个参数为播放位置。

第二种方法,为游戏对象添加一个AudioSource组件,在脚本中通过GetComponent()方法获得该组件,调用其play()方法进行播放。

案例下载 密码:z79o

unity案例入门(二)(坦克大战)的更多相关文章

  1. 关于Unity的入门游戏飞机大战的开发(下)

    开发思路: 1: 修改测试模式,去掉开始按钮方便开发,加入敌机的资源2: 创建敌机 添加刚体,碰撞器组件,添加帧动画播放组件;3: 创建敌机出现的队形;4: 根据队形随机 生成我们的敌机,调整敌机的速 ...

  2. 关于Unity的入门游戏飞机大战的开发(上)

    每个组件都是一个类的实例,要获得某个组件,要先创建一个同类型的组件类实例,然后把实例传引用过去,就可以对想要的组件实例进行操作. 做游戏一般创建一个逻辑节点,里面只管逻辑,再创建一个动画节点,里面有好 ...

  3. Unity游戏神经网络版坦克大战

    基于遗传算法优化的神经网络来训练坦克AI是什么体验呢?下面有bulid好的demo. 包括window和安卓两个版本. 这是一个Unity项目. 下载链接:https://pan.baidu.com/ ...

  4. unity案例入门(一)(拾取游戏)

    1. 案例简述 这个案例实现一个非常简单的拾取宝物游戏,主角是一个小球,玩家通过键盘控制小球拾取全部宝物. 2. 键盘控制物体移动 private Rigidbody rd; public int f ...

  5. 《杜增强讲Unity之Tanks坦克大战》1-准备工作

    0.案例介绍 0.1开始界面   点击Play Now 进入游戏界面   左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火   右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...

  6. 阶段学习总结-坦克大战(2D)案例

    这是前几天学习的案例,这两天学习了NGUI和UGUI,被UI搞得很烦躁,但是今天还是将前几天学习的坦克大战总结以下.这个游戏是小时候的经典红白机游戏的复刻,见截图: 一.游戏物体 游戏中包含地图元素( ...

  7. (二)Hololens Unity 开发入门 之 Hello HoloLens~

    学习源于官方文档 微软官文~ 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (二)Hololens Unity 开发入门 之 Hello HoloLens~ 本文主要 ...

  8. Java坦克大战(二)

    本文紧接上一篇讲解坦克大战这个项目,因为当初在学习的时候,是以这个案例逐步学习Java基础的,过程是先讲知识点,再将知识点逐步的融入到项目中,即给坦克添加新的功能.之前的Demo练习,想都记录下来.这 ...

  9. 《杜增强讲Unity之Tanks坦克大战》10-相机控制

    10 相机控制 本节主要学习如何控制相机自动调整位置和焦距,使两个坦克一直同时在视野内.   image 在Hierarchy点击右键   image 点击 Create Empty,生成空对象,改名 ...

随机推荐

  1. python学习1:程序元素和基本使用方法(跟随mooc学习)

    程序元素: 注释,缩进,变量,常量,表达式 输入,输出,分支,循环 示例程序,温度转换程序: #TempConvert.pyval=input("请输入带温度表示符号发温度值(例如:32C) ...

  2. 使用 RxJS 实现一个简易的仿 Elm 架构应用

    使用 RxJS 实现一个简易的仿 Elm 架构应用 标签(空格分隔): 前端 什么是 Elm 架构 Elm 架构是一种使用 Elm 语言编写 Web 前端应用的简单架构,在代码模块化.代码重用以及测试 ...

  3. 简单的led驱动程序设计

    基于ok6410: led驱动程序: vim led.c #include<linux/kernel.h>#include<linux/module.h>#include< ...

  4. 6.C++初步分析类

    面向对象的意义在于: -将日常生活中习惯的思维方式引入程序设计中 -将需求中的慨念直观的映射到解决方案中 -以模块为中心构建可复用的软件系统 -提高软件产品的可维护性和可扩展性 其中类和对象是面向对象 ...

  5. CocosCreator游戏开发---菜鸟学习之路(二)SocketIO简易教程

    请先参考教程司令部-SocketIO教程进行相关操作 开发完成后部分用户会出现持续输出 a userConnected的BUG 如下图所示 经过一段时间的BUG检查终于发现了问题所在.每个人碰到的情况 ...

  6. php + 和 array_merge的区别

    (1)对于+,当key相同时,都是舍弃后面的结果: array_merge ,当key相同时,key是字符,则后面的覆盖前面的:key是数字,则不发生覆盖,会重新建立数组索引. $arr1 = arr ...

  7. bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)

    题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...

  8. 利用ajax获取网页表单数据,并存储到数据库之一(使用JDBC)

    所谓JDBC就是利用java与数据库相连接的技术,从数据库获取既有的信息或者把网页上的信息存储到数据库. 这里简单的介绍公司的一个小项目中的一部分,由于代码较多,所以用图片形式进行展示.源码请查看源码 ...

  9. 阿里云服务器 无法连接svn

    网上所说的在服务器中:1. 配置防火墙 2.svnserve.conf没配置好,3.svn客户端缓存,都进行排查处理,还是连接不上. 最后使用ip add 查看服务器网卡ip命令 发现无法看到当前服务 ...

  10. java-redis列表数据操作示例(二)

    接上篇博文<java-redis字符类数据操作示例(一)>,redis连接管理类的代码请跳转查看. 一.列表类型缓存测试类 public class ListTest { /** * 主测 ...