[TUTORIAL] Sistema de Arma 3D
2 participantes
Página 1 de 1
[TUTORIAL] Sistema de Arma 3D
Estava fazendo um Sistema de Arma 3D para um Projeto, vou deixar aqui, pode ser que seja útil para alguém.
Script da Arma:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
[RequireComponent(typeof(AudioSource))]
public class Weapon : MonoBehaviour
{
[Space(5)]
[Header("Basic Settings")]
[SerializeField] private Camera playerCam;
[Range(1, 100)]
[SerializeField] private float damage = 20f;
[Range(1, 1000)]
[SerializeField] private float range = 200f;
[Range(1, 200)]
[SerializeField] private float impactForce = 40f;
[Range(0, 40)]
[SerializeField] private float fireRate = 15f;
[Range(0, 10)]
[SerializeField] private float timeAnimReload = 2f;
private float timeFire = 0f;
[SerializeField] private KeyCode reloadKey = KeyCode.R;
[Space(5)]
[Header("Effects Prefab Settings")]
[Space(30)]
//Effects
[SerializeField] private GameObject prefab_Effect_all;
[SerializeField] private GameObject prefab_Effect_enemy;
[Space(10)]
[Header("Shoot Effect Gun")]
[Space(30)]
[SerializeField] private ParticleSystem shootEffect;
[Space(5)]
[Header("Sounds Settings")]
[Space(30)]
//Sounds
[SerializeField] private AudioSource aud_s;
[SerializeField] private AudioClip _Shoot_Sound;
[SerializeField] private AudioClip _Reload_Sound;
[Space(5)]
[Header("Ammunition Settings")]
[Space(30)]
//Ammuntion
[Range(0,60)]
[SerializeField] private int _Ammuntion = 40;
[Range(0, 50)]
[SerializeField] private int _AmmuntionClip = 20;
[Range(0, 500)]
[SerializeField] private int _AmmuntionInBag = 130;
int internal_Amm;
//Shoot&ReloadCheck
bool ReloadOk = false;
int Allbullet;
[Space(5)]
[Header("TMP Text Settings")]
[Space(30)]
//Text
[SerializeField] private TMP_Text _TextAmmunition;
[SerializeField] private TMP_Text _TextAmmunitionInBag;
public int AinBag
{
get => _AmmuntionInBag;
set => _AmmuntionInBag = value;
}
void Start()
{
internal_Amm = _Ammuntion;
shootEffect.Stop();
aud_s.loop = false;
aud_s.playOnAwake = false;
}
void Update()
{
Allbullet = _Ammuntion + _AmmuntionInBag;
//Inputs
if(Input.GetButton("Fire1") && Time.time >= timeFire && _Ammuntion > 0 && ReloadOk == false)
{
timeFire = Time.time + 1f/fireRate;
shootEffect.Play();
Shoot();
_Ammuntion -= 1;
//Shoot Sound
aud_s.clip = _Shoot_Sound;
aud_s.PlayOneShot(_Shoot_Sound);
}
if(Input.GetKeyDown(reloadKey) && Allbullet > 0)
{
ReloadOk = false;
aud_s.clip = _Reload_Sound;
aud_s.Play();
StartCoroutine(ReloadAnim());
}
_TextAmmunition.text = _Ammuntion.ToString();
_TextAmmunitionInBag.text = _AmmuntionInBag.ToString();
}
//Shoot
public void Shoot()
{
RaycastHit hit;
if(Physics.Raycast(playerCam.transform.position, playerCam.transform.forward, out hit, range))
{
var enemy = hit.transform.GetComponent<Enemy>();
if(hit.rigidbody != null)
{
hit.rigidbody.AddForce(-hit.normal * impactForce);
}
if(enemy != null)
{
enemy.EnemyLife -= damage;
GameObject _impact = Instantiate(prefab_Effect_enemy, hit.point, Quaternion.LookRotation(hit.normal));
Destroy(_impact, 2f);
} else{
GameObject _impact = Instantiate(prefab_Effect_all, hit.point, Quaternion.LookRotation(hit.normal));
Destroy(_impact, 2f);
}
}
}
//Reload
public void Reload()
{
if (Allbullet >= _AmmuntionClip)
{
_Ammuntion = _AmmuntionClip;
_AmmuntionInBag = Allbullet - _AmmuntionClip;
} else
{
_Ammuntion = Allbullet;
_AmmuntionInBag = 0;
}
ReloadOk = false;
}
IEnumerator ReloadAnim()
{
yield return new WaitForSeconds(timeAnimReload);
ReloadOk = true;
Reload();
}
}
Coloque a Tag "Player" no seu jogador.
Acho que não precisa explicar o Basic Settings, pq é bem intuitivo.
Prefab_Effect_all = prefab que vai ser instanciada em qualquer gameObject que não tenha o Componente do inimigo.
Prefab_Effect_enemy = prefab que vai ser instanciada em qualquer gameObject que tenha o Componente do inimigo.
TMP Text Settings = Textos do canvas.
Script de Inimigo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
[SerializeField] private float _LifeEnemy = 200;
public float EnemyLife
{
get => _LifeEnemy;
set => _LifeEnemy = value;
}
void Update()
{
if(_LifeEnemy <= 0)
{
Dead();
}
}
void Dead()
{
Destroy(gameObject, 1f);
}
}
Nele só vai estar a vida.
Script de Munição:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
[Range(1, 50)]
public int bullet = 15;
public float _DistancePlayer = 1.5f;
public KeyCode _key = KeyCode.F;
public AudioClip sound;
bool a = true;
void Update()
{
GameObject p;
p = GameObject.FindWithTag("Player");
var player = p.GetComponentInChildren<Weapon>();
var _aud = p.GetComponent<AudioSource>();
float d = Vector3.Distance(transform.position, player.gameObject.transform.position);
if(d < _DistancePlayer && Input.GetKeyDown(_key) && a == true)
{
player.AinBag += bullet;
a = false;
_aud.clip = sound;
_aud.Play();
Destroy(gameObject);
}
}
}
Coloque ela no objeto que você deseja, que seja a munição no seu game.
Vou deixar um repositório de um projeto com esse Sistema configurado:
https://github.com/SrCharlesB/WeaponUnity3D
Charlesoff- MembroAvançado
- PONTOS : 1780
REPUTAÇÃO : 40
Áreas de atuação : Game dev
Respeito as regras :
Re: [TUTORIAL] Sistema de Arma 3D
Vlw tu consegue colocar os áudios pra baixar?
PROgamadornoob- Iniciante
- PONTOS : 1227
REPUTAÇÃO : 3
Respeito as regras :
Re: [TUTORIAL] Sistema de Arma 3D
PROgamadornoob escreveu:Vlw tu consegue colocar os áudios pra baixar?
Você pode baixar do repositório que deixei acima.
Clica no áudio.
Aí só baixar.
Charlesoff- MembroAvançado
- PONTOS : 1780
REPUTAÇÃO : 40
Áreas de atuação : Game dev
Respeito as regras :
Re: [TUTORIAL] Sistema de Arma 3D
Update, coloquei Unity Events nos tiros e no reload. Assim pode chamar algo quando você atirar ou recarregar a arma, por exemplo uma animação.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.Events;
[RequireComponent(typeof(AudioSource))]
public class Weapon : MonoBehaviour
{
[Space(5)]
[Header("Basic Settings")]
[SerializeField] private Camera playerCam;
[Range(1, 100)]
[SerializeField] private float damage = 20f;
[Range(1, 1000)]
[SerializeField] private float range = 200f;
[Range(1, 200)]
[SerializeField] private float impactForce = 40f;
[Range(0, 40)]
[SerializeField] private float fireRate = 15f;
[Range(0, 10)]
[SerializeField] private float timeAnimReload = 2f;
private float timeFire = 0f;
[SerializeField] private KeyCode reloadKey = KeyCode.R;
[Space(5)]
[Header("Effects Prefab Settings")]
[Space(30)]
//Effects
[SerializeField] private GameObject prefab_Effect_all;
[SerializeField] private GameObject prefab_Effect_enemy;
[Space(10)]
[Header("Shoot Effect Gun")]
[Space(30)]
[SerializeField] private ParticleSystem shootEffect;
[Space(5)]
[Header("Sounds Settings")]
[Space(30)]
//Sounds
[SerializeField] private AudioSource aud_s;
[SerializeField] private AudioClip _Shoot_Sound;
[SerializeField] private AudioClip _Reload_Sound;
[Space(5)]
[Header("Ammunition Settings")]
[Space(30)]
//Ammuntion
[Range(0,60)]
[SerializeField] private int _Ammuntion = 40;
[Range(0, 50)]
[SerializeField] private int _AmmuntionClip = 20;
[Range(0, 500)]
[SerializeField] private int _AmmuntionInBag = 130;
int internal_Amm;
//Shoot&ReloadCheck
bool ReloadOk = false;
int Allbullet;
[Space(5)]
[Header("TMP Text Settings")]
[Space(30)]
//Text
[SerializeField] private TMP_Text _TextAmmunition;
[SerializeField] private TMP_Text _TextAmmunitionInBag;
//Events
[Space(5)]
[Header("Events")]
[Space(30)]
[SerializeField] private UnityEvent mouseFireEvent;
[SerializeField] private UnityEvent reloadEvent;
public int AinBag
{
get => _AmmuntionInBag;
set => _AmmuntionInBag = value;
}
void Start()
{
internal_Amm = _Ammuntion;
shootEffect.Stop();
aud_s.loop = false;
aud_s.playOnAwake = false;
}
void Update()
{
Allbullet = _Ammuntion + _AmmuntionInBag;
//Inputs
if(Input.GetButton("Fire1") && Time.time >= timeFire && _Ammuntion > 0 && ReloadOk == false)
{
mouseFireEvent.Invoke();
timeFire = Time.time + 1f/fireRate;
shootEffect.Play();
Shoot();
_Ammuntion -= 1;
//Shoot Sound
aud_s.clip = _Shoot_Sound;
aud_s.PlayOneShot(_Shoot_Sound);
}
if(Input.GetKeyDown(reloadKey) && Allbullet > 0)
{
reloadEvent.Invoke();
ReloadOk = false;
aud_s.clip = _Reload_Sound;
aud_s.Play();
StartCoroutine(ReloadAnim());
}
_TextAmmunition.text = _Ammuntion.ToString();
_TextAmmunitionInBag.text = _AmmuntionInBag.ToString();
}
//Shoot
public void Shoot()
{
RaycastHit hit;
if(Physics.Raycast(playerCam.transform.position, playerCam.transform.forward, out hit, range))
{
var enemy = hit.transform.GetComponent<Enemy>();
if(hit.rigidbody != null)
{
hit.rigidbody.AddForce(-hit.normal * impactForce);
}
if(enemy != null)
{
enemy.EnemyLife -= damage;
GameObject _impact = Instantiate(prefab_Effect_enemy, hit.point, Quaternion.LookRotation(hit.normal));
Destroy(_impact, 2f);
} else{
GameObject _impact = Instantiate(prefab_Effect_all, hit.point, Quaternion.LookRotation(hit.normal));
Destroy(_impact, 2f);
}
}
}
//Reload
public void Reload()
{
if (Allbullet >= _AmmuntionClip)
{
_Ammuntion = _AmmuntionClip;
_AmmuntionInBag = Allbullet - _AmmuntionClip;
} else
{
_Ammuntion = Allbullet;
_AmmuntionInBag = 0;
}
ReloadOk = false;
}
IEnumerator ReloadAnim()
{
ReloadOk = true;
yield return new WaitForSeconds(timeAnimReload);
Reload();
}
}
Charlesoff- MembroAvançado
- PONTOS : 1780
REPUTAÇÃO : 40
Áreas de atuação : Game dev
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] SISTEMA DE PEGAR ARMA/SEU OBJETO DO CHÃO!
» [TUTORIAL] Script de arma 2D [Unity]
» [TUTORIAL] Script de arma completo! [FREE]
» [TUTORIAL] Arma tipo a do call of duty
» [TUTORIAL] Pegar arma do chão ao Aperta E (Unity 5)
» [TUTORIAL] Script de arma 2D [Unity]
» [TUTORIAL] Script de arma completo! [FREE]
» [TUTORIAL] Arma tipo a do call of duty
» [TUTORIAL] Pegar arma do chão ao Aperta E (Unity 5)
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos