框架視圖
坦克大戰(zhàn)
關(guān)鍵代碼
GameStart
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class GameStart : MonoBehaviour {
void Update () {
if (Input.GetMouseButtonDown(0))
{
SceneManager.LoadScene(1);
}
}
}
TankMovement
public class TankMovement : MonoBehaviour {
//定義一個(gè)移動(dòng)速度;
public float speed = 5;
//定義一個(gè)旋轉(zhuǎn)的速度
public float angularSpeed = 5;
//定義一個(gè)剛體的變量
private Rigidbody m_Rigidbody;
//增加坦克的編號(hào) 或者控制不同的軸
public float number = 2; //增加坦克的編號(hào)纷铣,通過(guò)編號(hào)進(jìn)行不同的控制;
//聲明坦克停止和駕駛的兩個(gè)狀態(tài)的聲音變量;
public AudioClip idleAudio;
public AudioClip drivingAudio;
//獲取聲音源的組件 用來(lái)判斷坦克是播放那種音效而用的
private AudioSource audio;
void Start () {
//獲取剛體組件
m_Rigidbody=gameObject.GetComponent<Rigidbody>();
//獲取聲音源組件利赋;
audio=gameObject.GetComponent<AudioSource>();
}
//物理位移一般都定義在FixedUpdate中郁妈;
void FixedUpdate() {
// //第一種控制坦克移動(dòng)你的方法;
// if (Input.GetKey(KeyCode.A))
// {
// m_Rigidbody.AddForce(Vector3.left*speed,ForceMode.Force);
// }
// if (Input.GetKey(KeyCode.D))
// {
// m_Rigidbody.AddForce(Vector3.right*speed,ForceMode.Force);
// }
// if (Input.GetKey(KeyCode.W))
// {
// m_Rigidbody.AddForce(Vector3.forward*speed,ForceMode.Force);
// }
// if (Input.GetKey(KeyCode.S))
// {
// m_Rigidbody.AddForce(Vector3.back*speed,ForceMode.Force);
// }
//第二種控制坦克移動(dòng)的方法
//垂直方向
float v = Input.GetAxis("VerticalPlayer"+number);
//給剛體加一個(gè)速度趾断;
m_Rigidbody.velocity = gameObject.transform.forward*v*speed;
//水平方向
//float h = Input.GetAxis("Horizontal");
// m_Rigidbody.velocity = gameObject.transform.right*h*speed;
//水平旋轉(zhuǎn)
float h = Input.GetAxis("HorizontalPlayer"+number);
//給水平方向加一個(gè)旋轉(zhuǎn)速度
m_Rigidbody.angularVelocity = gameObject.transform.up*h*angularSpeed;
//判斷是播放閑置狀態(tài)還是駕駛狀態(tài) 聲音源
if (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0) //判斷是否有按下鍵 數(shù)學(xué)絕對(duì)值拒名;
{
audio.clip = drivingAudio;//切記是:audio.clip
if (audio.isPlaying == false)
{
audio.Play();
}
}
else {
audio.clip = idleAudio;
if (audio.isPlaying == false)
{
audio.Play();
}
}
//if (audio.isPlaying == false)
//{
// audio.Play();
//}
}
}
DestoryForTime
public class DestoryForTime : MonoBehaviour {
//一段時(shí)間后銷(xiāo)毀爆炸效果
//定義一個(gè)時(shí)間
public float time;
void Start () {
//一開(kāi)始或者說(shuō)一生成就調(diào)用銷(xiāo)毀的方法;
GameObject.Destroy(this.gameObject,time);
}
}
FllowTarget
public class FllowTarget : MonoBehaviour {
//聲明兩個(gè)把物體的位置變量 用來(lái)計(jì)算兩個(gè)位置的偏移值
public Transform player1;
public Transform player2;
//聲明一個(gè)偏移值的變量芋酌;
Vector3 offset;
//聲明相機(jī)的類(lèi)型變量增显。為了獲取size大小;
private Camera camera;
void Start () {
//計(jì)算偏移值同云;
offset = transform.position - (player1.position + player2.position) / 2;
//給相機(jī)組件賦值糖权;
camera=gameObject.GetComponent<Camera>();
}
void Update () {
if (player1!=null&&player2!=null)
{
//補(bǔ)償相機(jī)的位置;或者說(shuō)保持偏移值炸站;
gameObject.transform.position = offset + (player1.position + player2.position) / 2;
//兩個(gè)坦克走近視野變小星澳,走遠(yuǎn)視野變大
//計(jì)算距離;
float distance = Vector3.Distance(player1.position, player2.position);
//計(jì)算出來(lái)是 相機(jī)size 7.5/(7.33+1.12)=0.88
float size = distance * 0.88f;
//正交視野
camera.orthographicSize = size;
}
}
}
Shell
public class Shell : MonoBehaviour {
//定義一個(gè)子彈爆炸的預(yù)置體旱易,預(yù)置體記得勾選play on awake禁偎;
public GameObject shellExplosionPrefab;
//定義一個(gè)子彈爆炸的聲音的變量;
public AudioClip shellExplosionAudio;
//觸發(fā)方法阀坏,將子彈設(shè)置成觸發(fā)器如暖;
void OnTriggerEnter(Collider coll) {
//子彈爆炸的聲音;
AudioSource.PlayClipAtPoint(shellExplosionAudio,transform.position);
//生成爆炸效果 GameObject.Instantiate(shellExplosionPrefab,transform.position,transform.rotation);
//注意順序忌堂,別吧銷(xiāo)毀子彈放在前面盒至;
//銷(xiāo)毀子彈
GameObject.Destroy(this.gameObject);
//判斷坦克受到傷害;如果受到傷害 發(fā)送一個(gè)消息士修,調(diào)用更改生命的方法 在判斷之前先把坦克定義一個(gè)便簽
if (coll.tag == "Tank")
{
coll.SendMessage("TakeDamage");
}
}
}
TankAttack
public class TankAttack : MonoBehaviour {
//定義一個(gè)子彈預(yù)置體并且賦值枷遂;
public GameObject shellPrefab;
//定義一個(gè)變量,通過(guò)查找空物體位置棋嘲;用來(lái)存放實(shí)例化的位置
private Transform m_Transform;
//定義一個(gè)發(fā)射子彈的按鍵登淘;
public KeyCode fireKey = KeyCode.Space;
//定義一個(gè)子彈的速度
public float shellSpeed = 15;
//定義一個(gè)發(fā)射子彈的聲音;
public AudioClip shellAudio;
void Start () {
//給定義的transform賦值封字;
m_Transform = gameObject.transform.Find("FirePosition");
}
void Update () {
//如果按下空格鍵黔州,實(shí)例化子彈; 第一種
////if (Input.GetKeyDown(KeyCode.Space))
////{
//// GameObject.Instantiate(shellPrefab,m_Transform.position,Quaternion.identity);
////}
//第二種
if (Input.GetKeyDown(fireKey))
{
//按下發(fā)射鍵時(shí)播放子彈聲音
AudioSource.PlayClipAtPoint(shellAudio,transform.position);
// GameObject.Instantiate(shellPrefab,m_Transform.position,m_Transform.rotation);
GameObject go = GameObject.Instantiate(shellPrefab,m_Transform.position,transform.rotation) as GameObject;
go.GetComponent<Rigidbody>().velocity = go.transform.forward * shellSpeed;
}
}
}
TankHealth
public class TankHealth : MonoBehaviour {
//定義一個(gè)坦克爆炸特效的預(yù)置體 勾選play on awake阔籽;
public GameObject TankExplosionPrefab;
//定義坦克的血量流妻;
public int hp = 100;
//聲明一個(gè)坦克爆炸的聲音的變量;
public AudioClip tankExplosionAudio;
//聲明一個(gè)UI的組件slider來(lái)獲取變量笆制;范圍是從0到1绅这;
public Slider hpSlider;
//聲明一個(gè)生命值,作為分母在辆,記錄整體的血量比例 因?yàn)閟lider的值是從0至1的证薇;
private int totalHp;
void Start () {
//給總血量賦值
totalHp = hp;
}
//定義傷害的方法;
void TakeDamage() {
//判斷血量
if (hp > 0)
{
//隨機(jī)一個(gè)傷害值匆篓,看誰(shuí)運(yùn)氣好
hp -= Random.Range(5, 10);
//Debug.Log(hp);
//用slider的value來(lái)顯示 記得是float類(lèi)型
// hpSlider.value = hp / totalHp as float;
hpSlider.value = (float)hp / totalHp;
Debug.Log(hpSlider.value);
}
if (hp<=0) {
//播放坦克爆炸的聲音浑度;在某個(gè)固定點(diǎn)的位置播放;
AudioSource.PlayClipAtPoint(tankExplosionAudio,transform.position);//參數(shù)1:聲音源 參數(shù)2:位置鸦概;
//小于0 的時(shí)候 播放坦克爆炸特效箩张,并銷(xiāo)毀坦克 怎么播放特效?定義好預(yù)置體,并實(shí)例化
//播放爆炸效果
GameObject.Instantiate(TankExplosionPrefab,transform.position+Vector3.up,transform.rotation);//在坦克上空爆炸
//銷(xiāo)毀坦克
GameObject.Destroy(this.gameObject);
}
}
}
TankAttack