How can I make an "aim System" for my tank game? (See where shell will land)
I follow the Tank-tutorial by Unity . Now I want to expand the game by making something like an aim system. I want to see where the shell of my tank is landing before I fired it.
Additional one important thing is that the landing point varies, when i have a bigger launchforce or less launchforce. (like in the two pictures), the code is the tankShooting.
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.
public bool shellBoost = false;
public float m_PlusDamage = 0;
public float m_PlusExplosionForce = 0;
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 float startMinLaunchForce;
private float startMaxLaunchForce;
private float startChargeSpeed;
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;
startMaxLaunchForce = m_MaxLaunchForce;
startMinLaunchForce = m_MinLaunchForce;
startChargeSpeed = m_ChargeSpeed;
}
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.
for (int i = 0; i < m_FireTransform.Length; i++)
{
Rigidbody shellInstance =
Instantiate(m_Shell, m_FireTransform[i].position, m_FireTransform[i].rotation) as Rigidbody;
shellInstance.velocity = m_CurrentLaunchForce * m_FireTransform[i].forward;
if (shellBoost)
{
shellInstance.gameObject.GetComponent<ShellExplosion>().m_MaxDamage += m_PlusDamage;
shellInstance.gameObject.GetComponent<ShellExplosion>().m_ExplosionForce += m_PlusExplosionForce;
}
}
// 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;
}
Thank you
Please excuse my bad english...
Your answer
Follow this Question
Related Questions
Top down shooting in rotmg style 0 Answers
Argument Exception: GetComponentFastPath? built .exe of the game crashes! 3 Answers
How to drive a car/trolley on a path 1 Answer
Is it possible to make a path and point system? 0 Answers
Tanks Tutorial Title 0 Answers