9 發射子彈時蓄力
實現效果如下

按下開火鍵(坦克1為空格鍵)重置力為最小力,一直按着的時候蓄力,抬起的時候發射。如果按着的時候蓄力到最大,則自動發射,此時在抬起則不會重復發射。
首先定義和力相關的幾個變量
private float crtForce = 15; // 當前的力
private float minForce = 15; // 最小力 private float maxForce = 30; // 最大力
蓄力還需要一個速度
private float forceSpeed = 20; // 蓄力速度
蓄力實現
crtForce += forceSpeed * Time.deltaTime; // 蓄力
為了實現每次按下只發射一個炮彈,還需要標識一下本次有沒有發射。
private bool fired = false; // 有無開火
這個fired是在Fire()里面置為true的。
蓄力到最大值自動開火處理
if( crtForce >= maxForce && !fired ){ // 蓄力到最大值
crtForce = maxForce; // 設置最大力 Fire (); // 自動開火 }
開火鍵按下時,重置力為最小值,設置開火狀態為未開火
if (Input.GetButtonDown ("Fire" + id)) { // 開火鍵按下時
crtForce = minForce; // 重置力的大小 fired = false; // 設置開火狀態為未開火 }
一直按着時,蓄力
if( Input.GetButton ("Fire" + id) && !fired ) { // 一直按着,並且沒有開火的時候
crtForce += forceSpeed * Time.deltaTime; // 蓄力 }
抬起時需要判斷有沒有開火,沒有則開火
if( Input.GetButtonUp ("Fire" + id) && !fired) { // 抬起,並且還未開火
Fire (); // 則開火 }
蓄力AimSlider的更新
在Hierarchy上右鍵,選擇UI->Slider,添加Slider

將Slider改名為AimSlider,按着Alt點擊Slider

刪除Background和HandleSlideArea

選中AimSlider,取消選擇Interactable,設置Transition為None,設置Direction為Bottom To Top,Min為15,Max為30

同時選中AimSlider和FillArea,點擊Anchor,按住Alt鍵,點擊水平和垂直同時拉伸(右下角)

將Canvas拖入Tank中,設置Render Mode為World Space,重置其坐標,設置寬高均為3.5,rotation x為90

選中Fill,設置Source Image為Aim Arrow

選中AimSlider,移動其坐標使其正好處於坦克前方

保存Tank prefab,將aimSlider添加到Shooter腳本的引用中.

Shooter2.cs代碼:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class Shooter2 : MonoBehaviour {
public GameObject shellObject; // 子彈Prefab public Transform firePosition; // 發射點 public int id = 1; // 坦克id private float crtForce = 15; // 當前的力 private float minForce = 15; // 最小力 private float maxForce = 30; // 最大力 private float forceSpeed = 20; // 蓄力速度 private bool fired = false; // 有無開火 public Slider aimSlider; // 蓄力Slider // Update is called once per frame void Update () { aimSlider.value = minForce; // 重置slider的值 if( crtForce >= maxForce && !fired ){ // 蓄力到最大值 crtForce = maxForce; // 設置最大力 Fire (); // 自動開火 } if (Input.GetButtonDown ("Fire" + id)) { // 開火鍵按下時 crtForce = minForce; // 重置力的大小 fired = false; // 設置開火狀態為未開火 }else if( Input.GetButton ("Fire" + id) && !fired ) { // 一直按着,並且沒有開火的時候 crtForce += forceSpeed * Time.deltaTime; // 蓄力 aimSlider.value = crtForce; // 更新slider的值 }else if( Input.GetButtonUp ("Fire" + id) && !fired) { // 抬起,並且還未開火 Fire (); // 則開火 } } public void Fire(){ // 發射 fired = true; // 設置開火狀態為已開火 GameObject go = Instantiate (shellObject, firePosition.position, firePosition.rotation ) as GameObject; Rigidbody rb = go.GetComponent<Rigidbody> (); if (rb) rb.velocity = firePosition.forward * crtForce; }
}
---------------------------我是目錄分割線---------------------------
《杜增強講Unity之Tanks坦克大戰》4-坦克的移動和旋轉
《杜增強講Unity之Tanks坦克大戰》9-發射子彈時蓄力
《杜增強講Unity之Tanks坦克大戰》11-游戲流程控制
---------------------------我是目錄分割線---------------------------