《杜增強講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; } 

}

 

---------------------------我是目錄分割線---------------------------

《杜增強講Unity之Tanks坦克大戰》1-准備工作

《杜增強講Unity之Tanks坦克大戰》2-場景設置

《杜增強講Unity之Tanks坦克大戰》3-添加坦克

《杜增強講Unity之Tanks坦克大戰》4-坦克的移動和旋轉

《杜增強講Unity之Tanks坦克大戰》5-子彈

《杜增強講Unity之Tanks坦克大戰》6-發射子彈

《杜增強講Unity之Tanks坦克大戰》7-坦克血條

《杜增強講Unity之Tanks坦克大戰》8-子彈碰撞處理

《杜增強講Unity之Tanks坦克大戰》9-發射子彈時蓄力

《杜增強講Unity之Tanks坦克大戰》10-相機控制

《杜增強講Unity之Tanks坦克大戰》11-游戲流程控制

---------------------------我是目錄分割線---------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM