《Unity入門案例-Tanks坦克大戰》9-發射子彈時蓄力
9 發射子彈時蓄力
實現效果如下
image
按下開火鍵(坦克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
image
將Slider改名為AimSlider,按著Alt點選Slider
image
刪除Background和HandleSlideArea
image
選中AimSlider,取消選擇Interactable,設定Transition為None,設定Direction為Bottom To Top,Min為15,Max為30
image
同時選中AimSlider和FillArea,點選Anchor,按住Alt鍵,點選水平和垂直同時拉伸(右下角)
image
將Canvas拖入Tank中,設定Render Mode為World Space,重置其座標,設定寬高均為3.5,rotation x為90
image
選中Fill,設定Source Image為Aim Arrow
image
選中AimSlider,移動其座標使其正好處於坦克前方
image
儲存Tank prefab,將aimSlider新增到Shooter指令碼的引用中.
image
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; }
}