unity案例入门(二)(坦克大战)
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案例入门(二)(坦克大战)的更多相关文章
- 关于Unity的入门游戏飞机大战的开发(下)
		
开发思路: 1: 修改测试模式,去掉开始按钮方便开发,加入敌机的资源2: 创建敌机 添加刚体,碰撞器组件,添加帧动画播放组件;3: 创建敌机出现的队形;4: 根据队形随机 生成我们的敌机,调整敌机的速 ...
 - 关于Unity的入门游戏飞机大战的开发(上)
		
每个组件都是一个类的实例,要获得某个组件,要先创建一个同类型的组件类实例,然后把实例传引用过去,就可以对想要的组件实例进行操作. 做游戏一般创建一个逻辑节点,里面只管逻辑,再创建一个动画节点,里面有好 ...
 - Unity游戏神经网络版坦克大战
		
基于遗传算法优化的神经网络来训练坦克AI是什么体验呢?下面有bulid好的demo. 包括window和安卓两个版本. 这是一个Unity项目. 下载链接:https://pan.baidu.com/ ...
 - unity案例入门(一)(拾取游戏)
		
1. 案例简述 这个案例实现一个非常简单的拾取宝物游戏,主角是一个小球,玩家通过键盘控制小球拾取全部宝物. 2. 键盘控制物体移动 private Rigidbody rd; public int f ...
 - 《杜增强讲Unity之Tanks坦克大战》1-准备工作
		
0.案例介绍 0.1开始界面 点击Play Now 进入游戏界面 左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火 右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...
 - 阶段学习总结-坦克大战(2D)案例
		
这是前几天学习的案例,这两天学习了NGUI和UGUI,被UI搞得很烦躁,但是今天还是将前几天学习的坦克大战总结以下.这个游戏是小时候的经典红白机游戏的复刻,见截图: 一.游戏物体 游戏中包含地图元素( ...
 - (二)Hololens Unity 开发入门 之 Hello HoloLens~
		
学习源于官方文档 微软官文~ 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (二)Hololens Unity 开发入门 之 Hello HoloLens~ 本文主要 ...
 - Java坦克大战(二)
		
本文紧接上一篇讲解坦克大战这个项目,因为当初在学习的时候,是以这个案例逐步学习Java基础的,过程是先讲知识点,再将知识点逐步的融入到项目中,即给坦克添加新的功能.之前的Demo练习,想都记录下来.这 ...
 - 《杜增强讲Unity之Tanks坦克大战》10-相机控制
		
10 相机控制 本节主要学习如何控制相机自动调整位置和焦距,使两个坦克一直同时在视野内. image 在Hierarchy点击右键 image 点击 Create Empty,生成空对象,改名 ...
 
随机推荐
- VC调用Delphi对象接口
			
说在前头 很久没有碰Delphi的东西了,今天有个朋友让我帮他将一个Delphi中已经实现的功能在VC中进行使用,虽然后来又用VC的方式实现了该功能,但是在实现过程中想到了这样的调用方式,特写下本文以 ...
 - Windows下快速建立cocos2d-x项目
			
准备工作 1.根据当前系统版本,下载对应版本的Python 32位下载地址:http://www.python.org/ftp/python/2.7.5/python-2.7. ...
 - 一个Windows下线程池的实现(C++)
			
前言 本文配套代码:https://github.com/TTGuoying/ThreadPool 先看看几个概念: 线程:进程中负责执行的执行单元.一个进程中至少有一个线程. 多线程:一个进程中有多 ...
 - openwrt pptpd客户端
			
步骤 opkg update opkg install ppp-mod-pptp opkg install luci-proto-ppp 在OpenWRT安裝PPTP Client端 首先用ssh登陆 ...
 - 织梦autoindex应用 dedecms循环中判断第几条数据
			
arclist 标签下使用 [field:global.autoindex/] 默认从1开始 {dede:arclist row='10' titlelen='48' typeid='1' chann ...
 - spring 组件自动装载示例(@ComponentScan,@Component,@Scope)
			
今天学习spring的bean组件装载功能,个人不太喜欢xml文件一个个配置bean的方式,所以主要学习测试注解式的自动装载方式.下面将简单说明下@Component的用法,简单入门示例献给大家. ...
 - ubuntu17.10 python3.6 install plugins for AI
			
install order: tensorflow-gpu scikit-learn numpy scipy matplotlib tkinter tensorflow-gpu : pip insta ...
 - DxPackNet 3.音频捕捉(录音)
			
用DxpackNet捕捉音频其实很简单 1.初始化控件 IDxMicrophCapture microphone; private void Form1_Load(object sender, Eve ...
 - java url demo
			
// File Name : URLDemo.java import java.net.*; import java.io.*; public class URLDemo { public stati ...
 - AGC010 - B: Boxes
			
原题链接 题意简述 给出一个由个数构成的环,每次可以选择一个位置并从这个数起顺时针依次对每个数-1,-2,-3,-,-n.问能否将所有数全变为0. 分析 考虑一次操作对环带来了什么影响. (在后加一个 ...