一、代碼自我解析
二、油管學習地址
三、Unity3D源代碼
一、源代碼自我解析
using UnityEngine;
using UnityEngine.UI;
public class TankShooting : MonoBehaviour
{
public int m_PlayerNumber = 1; // 玩家名
public Rigidbody m_Shell; // 炮彈
public Transform m_FireTransform; // 開火位置
public Slider m_AimSlider; // 顯示當前發射力的坦克的子坦克
//(個人理解檢測炮彈和玩家坦克是否接觸的一個變量)
public AudioSource m_ShootingAudio; // 引用用於播放拍攝音頻的音頻源。注:不同於運動音源。
public AudioClip m_ChargingClip; // 由於有一個蓄力的音效,這就是每次發射時蓄力的音效
public AudioClip m_FireClip; // 每次射擊時發出的音效
public float m_MinLaunchForce = 15f; // 發射炮彈的最小的力
public float m_MaxLaunchForce = 30f; // 發射炮彈的最大的力
public float m_MaxChargeTime = 0.75f; // 最大的蓄力時間(達到最大力前)
private string m_FireButton; // 開火按鈕
private float m_CurrentLaunchForce; // 記錄發射炮彈實時的力(在共有變量的最小和最大之間變化)
private float m_ChargeSpeed; // 蓄力的速度
private bool m_Fired; // 判斷是否按下發射按鈕
private void OnEnable()
{
// 先將對炮彈的力設爲最小
m_CurrentLaunchForce = m_MinLaunchForce;
m_AimSlider.value = m_MinLaunchForce;
}
private void Start()
{
// 搞清楚炮彈是誰打出去的(二營長?)
m_FireButton = "Fire" + m_PlayerNumber;
// 設置炮彈的發射速度,實際上要靠區間大小以及最大蓄力時間來決定(使炮彈打出去看起來更自然)
m_ChargeSpeed = (m_MaxLaunchForce - m_MinLaunchForce) / m_MaxChargeTime;
}
private void Update()
{
// Track the current state of the fire button and make decisions based on the current launch force.
// 將對炮彈的力置爲最小
m_AimSlider.value = m_MinLaunchForce;
// 發射炮彈環節(如果蓄力過久則直接發射,如果蓄力不夠也發射炮彈不過不會比你設置的最小更小)
if (m_CurrentLaunchForce >= m_MaxLaunchForce && !m_Fired)
{
m_CurrentLaunchForce = m_MaxLaunchForce;
Fire();
}
else if (Input.GetButtonDown(m_FireButton))
{
m_Fired = false;
m_CurrentLaunchForce = m_MinLaunchForce;
m_ShootingAudio.clip = m_ChargingClip;
m_ShootingAudio.Play();
}
else if (Input.GetButton(m_FireButton) && !m_Fired)
{
m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime;
m_AimSlider.value = m_CurrentLaunchForce;
}
else if (Input.GetButtonUp(m_FireButton) && !m_Fired)
{
Fire();
}
}
private void Fire()
{
// Instantiate and launch the shell.
// 開火!加載和更新炮彈!
m_Fired = true;
// 讓炮彈動起來!
Rigidbody shellInstance = Instantiate(m_Shell, m_FireTransform.position, m_FireTransform.rotation) as Rigidbody;
// 炮彈動的時候的速度設置
shellInstance.velocity = m_CurrentLaunchForce * m_FireTransform.forward;
// 播放炮彈發射音效
m_ShootingAudio.clip = m_FireClip;
m_ShootingAudio.Play();
// 視頻裏說這樣是爲了確保炮彈不會出現一些不必要的BUG
m_CurrentLaunchForce = m_MinLaunchForce;
}
}
// 以上只是自己對於該代碼的理解,如有誤還望指出讓我及時改正。
二、油管學習Unity地址
https://www.youtube.com/watch?v=paLLfWd2k5A
三、Unity3D中該案例源代碼:
using UnityEngine;
using UnityEngine.UI;
namespace Complete
{
public class TankShooting : MonoBehaviour
{
public int m_PlayerNumber = 1; // Used to identify the different players.
public Rigidbody m_Shell; // Prefab of the shell.
public Transform m_FireTransform; // A child of the tank where the shells are spawned.
public Slider m_AimSlider; // A child of the tank that displays the current launch force.
public AudioSource m_ShootingAudio; // Reference to the audio source used to play the shooting audio. NB: different to the movement audio source.
public AudioClip m_ChargingClip; // Audio that plays when each shot is charging up.
public AudioClip m_FireClip; // Audio that plays when each shot is fired.
public float m_MinLaunchForce = 15f; // The force given to the shell if the fire button is not held.
public float m_MaxLaunchForce = 30f; // The force given to the shell if the fire button is held for the max charge time.
public float m_MaxChargeTime = 0.75f; // How long the shell can charge for before it is fired at max force.
private string m_FireButton; // The input axis that is used for launching shells.
private float m_CurrentLaunchForce; // The force that will be given to the shell when the fire button is released.
private float m_ChargeSpeed; // How fast the launch force increases, based on the max charge time.
private bool m_Fired; // Whether or not the shell has been launched with this button press.
private void OnEnable()
{
// When the tank is turned on, reset the launch force and the UI
m_CurrentLaunchForce = m_MinLaunchForce;
m_AimSlider.value = m_MinLaunchForce;
}
private void Start ()
{
// The fire axis is based on the player number.
m_FireButton = "Fire" + m_PlayerNumber;
// The rate that the launch force charges up is the range of possible forces by the max charge time.
m_ChargeSpeed = (m_MaxLaunchForce - m_MinLaunchForce) / m_MaxChargeTime;
}
private void Update ()
{
// The slider should have a default value of the minimum launch force.
m_AimSlider.value = m_MinLaunchForce;
// If the max force has been exceeded and the shell hasn't yet been launched...
if (m_CurrentLaunchForce >= m_MaxLaunchForce && !m_Fired)
{
// ... use the max force and launch the shell.
m_CurrentLaunchForce = m_MaxLaunchForce;
Fire ();
}
// Otherwise, if the fire button has just started being pressed...
else if (Input.GetButtonDown (m_FireButton))
{
// ... reset the fired flag and reset the launch force.
m_Fired = false;
m_CurrentLaunchForce = m_MinLaunchForce;
// Change the clip to the charging clip and start it playing.
m_ShootingAudio.clip = m_ChargingClip;
m_ShootingAudio.Play ();
}
// Otherwise, if the fire button is being held and the shell hasn't been launched yet...
else if (Input.GetButton (m_FireButton) && !m_Fired)
{
// Increment the launch force and update the slider.
m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime;
m_AimSlider.value = m_CurrentLaunchForce;
}
// Otherwise, if the fire button is released and the shell hasn't been launched yet...
else if (Input.GetButtonUp (m_FireButton) && !m_Fired)
{
// ... launch the shell.
Fire ();
}
}
private void Fire ()
{
// Set the fired flag so only Fire is only called once.
m_Fired = true;
// Create an instance of the shell and store a reference to it's rigidbody.
Rigidbody shellInstance =
Instantiate (m_Shell, m_FireTransform.position, m_FireTransform.rotation) as Rigidbody;
// Set the shell's velocity to the launch force in the fire position's forward direction.
shellInstance.velocity = m_CurrentLaunchForce * m_FireTransform.forward;
// Change the clip to the firing clip and play it.
m_ShootingAudio.clip = m_FireClip;
m_ShootingAudio.Play ();
// Reset the launch force. This is a precaution in case of missing button events.
m_CurrentLaunchForce = m_MinLaunchForce;
}
}
}