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. 树莓派上运行.net core 2.0程序

    记录中 参考: https://www.cnblogs.com/songxingzhu/p/7399991.html https://www.cnblogs.com/goodfulcom/p/7624 ...

  2. MarkDown 编辑数学公式

    1. 参考博客:http://blog.csdn.net/smstong/article/details/44340637 1 数学公式的web解决方案 在网页上显示漂亮的数学公式,是多年来数学工作者 ...

  3. Linux 安装配置 FTP 服务 (vsftpd)

    1. 安装 vsftpd yum install vsftpd -y 2. 创建用户 record adduser -s /bin/nologin -d /var/RecordFile/ record ...

  4. 数据与C

    //以十进制.八进制和十六进制输出100,加入#会显示前缀#include<stdio.h>int main(){ int x = 100; printf("dec = %d; ...

  5. Python面向对象篇(3)-封装、多态、反射及描述符

    1. 多态 多态,最浅显的意识就是同一事物具有多种形态,这很好理解,动物是一个大类,猫类属于动物类,狗类属于动物类,人也是属于动物类,那能理解成,猫.狗.人是一样的吗?当然不是,还有,水,分为液体.固 ...

  6. Linux-PATH_环境变量

    PATH变量         是linux系统里的一个环境变量,系统已经定义好了,我们不需要再定义. 作用:         是linux里使用的命令都存在在PATH变量后面指定的目录下,我们使用命令 ...

  7. python入门学习笔记(二)

    6.6替换元素 7.tuple类型 7.1创建tuple 7.2创建单元素tuple    7.3"可变"的tuple 8.条件判断和循环 8.1,if语句   8.2,if... ...

  8. js内存泄露的原因

    1.意外的全局变量 function fun(){ a=19//全局变量 console.log(a) } 2.未及时清理计时器或者回调函数 //记得及时清理定时器 var intervalId=se ...

  9. java2 - 语言基础

    一.结构流程图制作工具 xmind 的使用 二.Java 基础数据类型 回答以下问题: java 基本数据类型有几种? 整数类型是哪几种? 浮点数类型是哪几种? 字符类型关键字? 布尔类型关键字? 为 ...

  10. vue——安装并新建项目

    一.对于vue的安装: 1.安装vue之前先安装node,https://nodejs.org/zh-cn/download/,我装的是windows64位的: 2.下载好了之后就可以按照正常顺序安装 ...