[TUTORIAL] Arma tipo a do call of duty
2 participantes
Página 1 de 1
[TUTORIAL] Arma tipo a do call of duty
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class Weapon : MonoBehaviour
{
//variaveis de parametros gerais
public enum tiposDeArma { shotgun = 0, metralhadora = 1 };
public tiposDeArma _tiposDeArma;
[Header("paremetros gerais")]
public float velocidadeDoZoom = 0.4f;
[Range(0,120)]
public float zoomCameraPrimaria = 30;
[Range(0, 120)]
public float zoomCameraSecundaria = 30;
[Range(0, 120)]
public float tirarZoomCameraPrimaria = 75;
[Range(0, 120)]
public float tirarZoomCameraSecundaria = 60;
public float espalhamentoDosProjetilsSemMirar = 5f;
public float espalhamentoDosProjetilsMirando = 0.7f;
public float semMirarRecuoX = 0.02f;
public float semMirarRecuoY = 0.02f;
public float semMirarRecuoZ = 0.4f;
public float mirandoRecuoX = 0.04f;
public float mirandoRecuoY = 0.04f;
public float mirandoRecuoZ = -0.5f;
public float distancia = 10;//distancia maxima que os disparos atingem
public float velocidadeTiro = 0.02f;//velocidade que pode atirar
public int maxMunicaoNaArma = 31;//quantidade de municao dentro da arma
public int maxMunicaoForaDaArma = 200;//quantidade de municao que ainda resta para serem usadas
public float forcaDoImpacto = 1000;//forca que gera ao o projetil acertar um objeto com rigidbody
public bool semiAutomatica;//indica se a arma se comportara como uma semi automatica
private bool podeAtirar = true;
private int auxMaxMunicaoForaDaArma;
private int auxMaxMunicaoNaArma;
private Vector3 currentVelocity;
private readonly float smoothTime = 0.03f;
private bool mirando;
//variaveis para shotgun
[Header("Parametros para shotgun")]
public int numeroDeDisparos = 10;
//Variaveis de anexo de objetos
[Header("Variavei de anexo de objetos ou componentes")]
public GameObject min;
public GameObject max;
public GameObject minAux;
public GameObject maxAux;
public AudioClip somDoTiro;
public AudioClip somDeArmaVazia;
public GameObject buracoProjetil;
public GameObject respawBala;
public Camera cameraPrimaria;
public Camera cameraSecundaria;
public ParticleSystem fogoDaArma;//
private AudioSource controleAudio;
// Start is called before the first frame update
void Start()
{
auxMaxMunicaoNaArma = maxMunicaoNaArma;
auxMaxMunicaoForaDaArma = maxMunicaoForaDaArma;
//Desativa loop do audio
if(controleAudio != null)
{
controleAudio.loop = false;
}
cameraPrimaria = Camera.main;
}
// Update is called once per frame
void Update()
{
Atirar();
Mirar();
Cursor.lockState = CursorLockMode.Locked;//pode apagar essa linha
}
void Atirar()
{
//funciona em metralhadora e revolvers,sniper n testado mas deve funcionar
//Disparos automatico
if (Input.GetButton("Fire1") && semiAutomatica == false && podeAtirar)
{
if (_tiposDeArma == tiposDeArma.metralhadora&&auxMaxMunicaoNaArma != 0)
{
StartCoroutine("Tiro");
podeAtirar = false;
auxMaxMunicaoNaArma -= 1;
if(fogoDaArma!=null)
fogoDaArma.Play();
//sai som so se houver audio
if (somDoTiro != null)
controleAudio.PlayOneShot(somDoTiro);
if(auxMaxMunicaoNaArma == 0 && auxMaxMunicaoForaDaArma == 0)
{
if (somDeArmaVazia != null)
{
controleAudio.PlayOneShot(somDeArmaVazia);
}
}
if (!mirando)
{
//escolhe um numero aletorio que sera definido no editor pela variavel semMirarRecuox e semMirarRecuoY
float semMirarAleatorioX = Random.Range(-semMirarRecuoX, semMirarRecuoX);
float semMirarAleatorioY = Random.Range(-semMirarRecuoY, semMirarRecuoY);
minAux.transform.position += transform.right * semMirarAleatorioX;
minAux.transform.position += transform.up * semMirarAleatorioY;
minAux.transform.position += transform.forward * semMirarRecuoZ;
//espalhar disparos
Vector3 fireDirection = transform.forward;
Quaternion fireRotation = Quaternion.LookRotation(fireDirection);
Quaternion randomRotation = Random.rotation;
fireRotation = Quaternion.RotateTowards(fireRotation, randomRotation, Random.Range(0.0f, espalhamentoDosProjetilsSemMirar));
RaycastHit hit;
if (Physics.Raycast(respawBala.transform.position, fireRotation * Vector3.forward, out hit, distancia))
{
Quaternion hitRotacao = Quaternion.LookRotation(-hit.point);
GameObject buracoDoProjetil = Instantiate(buracoProjetil, (hit.normal * 0.05f) + hit.point, Quaternion.LookRotation(-hit.normal)) as GameObject;
buracoDoProjetil.transform.parent = hit.transform;
Destroy(buracoDoProjetil, 20);
if (hit.transform.gameObject.GetComponent<Rigidbody>() != null)
{
Rigidbody rg = hit.transform.gameObject.GetComponent<Rigidbody>();
rg.AddForce(forcaDoImpacto * respawBala.transform.forward);
}
}
}
if (mirando)
{
//escolhe um numero aletorio que sera definido no editor pela variavel MirandoRecuox e MirandoRecuoY
float MirarAleatorioX = Random.Range(-mirandoRecuoX, mirandoRecuoX);
float MirarAleatorioY = Random.Range(-mirandoRecuoY, mirandoRecuoY);
maxAux.transform.position += transform.right * MirarAleatorioX;
maxAux.transform.position += transform.up * MirarAleatorioY;
maxAux.transform.position += transform.forward * mirandoRecuoZ;
//espalhar os disparos
Vector3 fireDirection = transform.forward;
Quaternion fireRotation = Quaternion.LookRotation(fireDirection);
Quaternion randomRotation = Random.rotation;
fireRotation = Quaternion.RotateTowards(fireRotation, randomRotation, Random.Range(0.0f, espalhamentoDosProjetilsMirando));
RaycastHit hit;
if (Physics.Raycast(respawBala.transform.position, fireRotation * Vector3.forward, out hit, distancia))
{
GameObject buracoDoProjetil = Instantiate(buracoProjetil, (hit.normal * 0.05f) + hit.point, Quaternion.LookRotation(-hit.normal)) as GameObject;
buracoDoProjetil.transform.parent = hit.transform;
Destroy(buracoDoProjetil, 20);
if (hit.transform.gameObject.GetComponent<Rigidbody>() != null)
{
Rigidbody rg = hit.transform.gameObject.GetComponent<Rigidbody>();
rg.AddForce(forcaDoImpacto * respawBala.transform.forward);
}
}
}
}
}
//funciona em armas semi automatica
if (Input.GetButtonDown("Fire1") && semiAutomatica && podeAtirar)
{
if (_tiposDeArma == tiposDeArma.metralhadora && auxMaxMunicaoNaArma != 0)
{
StartCoroutine("Tiro");
podeAtirar = false;
auxMaxMunicaoNaArma -= 1;
if (fogoDaArma != null)
fogoDaArma.Play();
//sai som so se houver audio
if (somDoTiro != null)
controleAudio.PlayOneShot(somDoTiro);
if (auxMaxMunicaoNaArma == 0 && auxMaxMunicaoForaDaArma == 0)
{
if (somDeArmaVazia != null)
{
controleAudio.PlayOneShot(somDeArmaVazia);
}
}
if (!mirando)
{
//escolhe um numero aletorio que sera definido no editor pela variavel semMirarRecuox e semMirarRecuoY
float semMirarAleatorioX = Random.Range(-semMirarRecuoX, semMirarRecuoX);
float semMirarAleatorioY = Random.Range(-semMirarRecuoY, semMirarRecuoY);
minAux.transform.position += transform.right * semMirarAleatorioX;
minAux.transform.position += transform.up * semMirarAleatorioY;
minAux.transform.position += transform.forward * semMirarRecuoZ;
//espalhar disparos
Vector3 fireDirection = transform.forward;
Quaternion fireRotation = Quaternion.LookRotation(fireDirection);
Quaternion randomRotation = Random.rotation;
fireRotation = Quaternion.RotateTowards(fireRotation, randomRotation, Random.Range(0.0f, espalhamentoDosProjetilsSemMirar));
RaycastHit hit;
if (Physics.Raycast(respawBala.transform.position, fireRotation * Vector3.forward, out hit, distancia))
{
Quaternion hitRotacao = Quaternion.LookRotation(-hit.point);
GameObject buracoDoProjetil = Instantiate(buracoProjetil, (hit.normal * 0.05f) + hit.point, Quaternion.LookRotation(-hit.normal)) as GameObject;
buracoDoProjetil.transform.parent = hit.transform;
Destroy(buracoDoProjetil, 20);
if (hit.transform.gameObject.GetComponent<Rigidbody>() != null)
{
Rigidbody rg = hit.transform.gameObject.GetComponent<Rigidbody>();
rg.AddForce(forcaDoImpacto * respawBala.transform.forward);
}
}
}
if (mirando)
{
//escolhe um numero aletorio que sera definido no editor pela variavel MirandoRecuox e MirandoRecuoY
float MirarAleatorioX = Random.Range(-mirandoRecuoX, mirandoRecuoX);
float MirarAleatorioY = Random.Range(-mirandoRecuoY, mirandoRecuoY);
maxAux.transform.position += transform.right * MirarAleatorioX;
maxAux.transform.position += transform.up * MirarAleatorioY;
maxAux.transform.position += transform.forward * mirandoRecuoZ;
//espalhar os disparos
Vector3 fireDirection = transform.forward;
Quaternion fireRotation = Quaternion.LookRotation(fireDirection);
Quaternion randomRotation = Random.rotation;
fireRotation = Quaternion.RotateTowards(fireRotation, randomRotation, Random.Range(0.0f, espalhamentoDosProjetilsMirando));
RaycastHit hit;
if (Physics.Raycast(respawBala.transform.position, fireRotation * Vector3.forward, out hit, distancia))
{
GameObject buracoDoProjetil = Instantiate(buracoProjetil, (hit.normal * 0.05f) + hit.point, Quaternion.LookRotation(-hit.normal)) as GameObject;
buracoDoProjetil.transform.parent = hit.transform;
Destroy(buracoDoProjetil, 20);
if (hit.transform.gameObject.GetComponent<Rigidbody>() != null)
{
Rigidbody rg = hit.transform.gameObject.GetComponent<Rigidbody>();
rg.AddForce(forcaDoImpacto * respawBala.transform.forward);
}
}
}
}
}
//Funiciona em shotguns semi automatica
if (Input.GetButtonDown("Fire1") && semiAutomatica && podeAtirar)
{
if (_tiposDeArma == tiposDeArma.shotgun && auxMaxMunicaoNaArma != 0)
{
StartCoroutine("Tiro");
podeAtirar = false;
auxMaxMunicaoNaArma -= 1;
if (fogoDaArma != null)
fogoDaArma.Play();
//sai som so se houver audio
if (somDoTiro != null)
controleAudio.PlayOneShot(somDoTiro);
if (auxMaxMunicaoNaArma == 0 && auxMaxMunicaoForaDaArma == 0)
{
if (somDeArmaVazia != null)
{
controleAudio.PlayOneShot(somDeArmaVazia);
}
}
if (!mirando)
{
//escolhe um numero aletorio que sera definido no editor pela variavel semMirarRecuox e semMirarRecuoY
float semMirarAleatorioX = Random.Range(-semMirarRecuoX, semMirarRecuoX);
float semMirarAleatorioY = Random.Range(-semMirarRecuoY, semMirarRecuoY);
minAux.transform.position += transform.right * semMirarAleatorioX;
minAux.transform.position += transform.up * semMirarAleatorioY;
minAux.transform.position += transform.forward * semMirarRecuoZ;
//espalhar disparos
RaycastHit hit;
for (int i = 0; i <= numeroDeDisparos; i++)
{
//espalhar disparos
Vector3 fireDirection = transform.forward;
Quaternion fireRotation = Quaternion.LookRotation(fireDirection);
Quaternion randomRotation = Random.rotation;
fireRotation = Quaternion.RotateTowards(fireRotation, randomRotation, Random.Range(0.0f, espalhamentoDosProjetilsSemMirar));
if (Physics.Raycast(respawBala.transform.position, fireRotation * Vector3.forward, out hit, distancia))
{
Quaternion hitRotacao = Quaternion.LookRotation(-hit.point);
GameObject buracoDoProjetil = Instantiate(buracoProjetil, (hit.normal * 0.05f) + hit.point, Quaternion.LookRotation(-hit.normal)) as GameObject;
buracoDoProjetil.transform.parent = hit.transform;
Destroy(buracoDoProjetil, 20);
if (hit.transform.gameObject.GetComponent<Rigidbody>() != null)
{
Rigidbody rg = hit.transform.gameObject.GetComponent<Rigidbody>();
rg.AddForce(forcaDoImpacto * respawBala.transform.forward);
}
}
}
}
if (mirando)
{
//escolhe um numero aletorio que sera definido no editor pela variavel MirandoRecuox e MirandoRecuoY
float MirarAleatorioX = Random.Range(-mirandoRecuoX, mirandoRecuoX);
float MirarAleatorioY = Random.Range(-mirandoRecuoY, mirandoRecuoY);
maxAux.transform.position += transform.right * MirarAleatorioX;
maxAux.transform.position += transform.up * MirarAleatorioY;
maxAux.transform.position += transform.forward * mirandoRecuoZ;
RaycastHit hit;
for (int i = 0; i <= numeroDeDisparos; i++)
{
//espalhar os disparos
Vector3 fireDirection = transform.forward;
Quaternion fireRotation = Quaternion.LookRotation(fireDirection);
Quaternion randomRotation = Random.rotation;
fireRotation = Quaternion.RotateTowards(fireRotation, randomRotation, Random.Range(0.0f, espalhamentoDosProjetilsMirando));
if (Physics.Raycast(respawBala.transform.position, fireRotation * Vector3.forward, out hit, distancia))
{
GameObject buracoDoProjetil = Instantiate(buracoProjetil, (hit.normal * 0.05f) + hit.point, Quaternion.LookRotation(-hit.normal)) as GameObject;
buracoDoProjetil.transform.parent = hit.transform;
Destroy(buracoDoProjetil, 20);
if (hit.transform.gameObject.GetComponent<Rigidbody>() != null)
{
Rigidbody rg = hit.transform.gameObject.GetComponent<Rigidbody>();
rg.AddForce(forcaDoImpacto * respawBala.transform.forward);
}
}
}
}
}
}
//funciona em shotguns automaticas
if (Input.GetButton("Fire1") && semiAutomatica == false&& podeAtirar)
{
if (_tiposDeArma == tiposDeArma.shotgun && auxMaxMunicaoNaArma != 0)
{
StartCoroutine("Tiro");
podeAtirar = false;
auxMaxMunicaoNaArma -= 1;
if (fogoDaArma != null)
fogoDaArma.Play();
//sai som so se houver audio
if (somDoTiro != null)
controleAudio.PlayOneShot(somDoTiro);
if (auxMaxMunicaoNaArma == 0 && auxMaxMunicaoForaDaArma == 0)
{
if (somDeArmaVazia != null)
{
controleAudio.PlayOneShot(somDeArmaVazia);
}
}
if (!mirando)
{
//escolhe um numero aletorio que sera definido no editor pela variavel semMirarRecuox e semMirarRecuoY
float semMirarAleatorioX = Random.Range(-semMirarRecuoX, semMirarRecuoX);
float semMirarAleatorioY = Random.Range(-semMirarRecuoY, semMirarRecuoY);
minAux.transform.position += transform.right * semMirarAleatorioX;
minAux.transform.position += transform.up * semMirarAleatorioY;
minAux.transform.position += transform.forward * semMirarRecuoZ;
//espalhar disparos
RaycastHit hit;
for (int i = 0; i <= numeroDeDisparos; i++)
{
//espalhar disparos
Vector3 fireDirection = transform.forward;
Quaternion fireRotation = Quaternion.LookRotation(fireDirection);
Quaternion randomRotation = Random.rotation;
fireRotation = Quaternion.RotateTowards(fireRotation, randomRotation, Random.Range(0.0f, espalhamentoDosProjetilsSemMirar));
if (Physics.Raycast(respawBala.transform.position, fireRotation * Vector3.forward, out hit, distancia))
{
Quaternion hitRotacao = Quaternion.LookRotation(-hit.point);
GameObject buracoDoProjetil = Instantiate(buracoProjetil, (hit.normal * 0.05f) + hit.point, Quaternion.LookRotation(-hit.normal)) as GameObject;
buracoDoProjetil.transform.parent = hit.transform;
Destroy(buracoDoProjetil, 20);
if (hit.transform.gameObject.GetComponent<Rigidbody>() != null)
{
Rigidbody rg = hit.transform.gameObject.GetComponent<Rigidbody>();
rg.AddForce(forcaDoImpacto * respawBala.transform.forward);
}
}
}
}
if (mirando)
{
//escolhe um numero aletorio que sera definido no editor pela variavel MirandoRecuox e MirandoRecuoY
float MirarAleatorioX = Random.Range(-mirandoRecuoX, mirandoRecuoX);
float MirarAleatorioY = Random.Range(-mirandoRecuoY, mirandoRecuoY);
maxAux.transform.position += transform.right * MirarAleatorioX;
maxAux.transform.position += transform.up * MirarAleatorioY;
maxAux.transform.position += transform.forward * mirandoRecuoZ;
RaycastHit hit;
for (int i = 0; i <= numeroDeDisparos; i++)
{
//espalhar os disparos
Vector3 fireDirection = transform.forward;
Quaternion fireRotation = Quaternion.LookRotation(fireDirection);
Quaternion randomRotation = Random.rotation;
fireRotation = Quaternion.RotateTowards(fireRotation, randomRotation, Random.Range(0.0f, espalhamentoDosProjetilsMirando));
if (Physics.Raycast(respawBala.transform.position, fireRotation * Vector3.forward, out hit, distancia))
{
GameObject buracoDoProjetil = Instantiate(buracoProjetil, (hit.normal * 0.05f) + hit.point, Quaternion.LookRotation(-hit.normal)) as GameObject;
buracoDoProjetil.transform.parent = hit.transform;
Destroy(buracoDoProjetil, 20);
if (hit.transform.gameObject.GetComponent<Rigidbody>() != null)
{
Rigidbody rg = hit.transform.gameObject.GetComponent<Rigidbody>();
rg.AddForce(forcaDoImpacto * respawBala.transform.forward);
}
}
}
}
}
}
}
void Mirar()
{
if (Input.GetButton("Fire2"))
{
maxAux.transform.position = Vector3.SmoothDamp(maxAux.transform.position, max.transform.position, ref currentVelocity, smoothTime);
transform.position = Vector3.SmoothDamp(transform.position, maxAux.transform.position, ref currentVelocity, smoothTime);
mirando = true;
//se houver camera secundaria sera aumentado o zoom
if (cameraSecundaria != null)
{
cameraSecundaria.fieldOfView -= velocidadeDoZoom;
if (cameraSecundaria.fieldOfView <= zoomCameraSecundaria)
{
cameraSecundaria.fieldOfView = zoomCameraSecundaria;
}
}
//aumentar zoom na camera primaria
cameraPrimaria.fieldOfView -= velocidadeDoZoom;
if(cameraPrimaria.fieldOfView <= zoomCameraPrimaria)
{
cameraPrimaria.fieldOfView = zoomCameraPrimaria;
}
}
else
{
minAux.transform.position = Vector3.SmoothDamp(minAux.transform.position,min.transform.position,ref currentVelocity,smoothTime);
transform.position = Vector3.SmoothDamp(transform.position, minAux.transform.position, ref currentVelocity, smoothTime);
mirando = false;
if(cameraSecundaria != null)
{
cameraSecundaria.fieldOfView += velocidadeDoZoom;
if(cameraSecundaria.fieldOfView >= tirarZoomCameraSecundaria)
{
cameraSecundaria.fieldOfView = tirarZoomCameraSecundaria;
}
}
cameraPrimaria.fieldOfView += velocidadeDoZoom;
if(cameraPrimaria.fieldOfView >= tirarZoomCameraPrimaria)
{
cameraPrimaria.fieldOfView = tirarZoomCameraPrimaria;
}
}
}
void Recarregar()
{//municao necessaria para recarregar arma
int municaoNessecaria = maxMunicaoNaArma - auxMaxMunicaoNaArma;
if (auxMaxMunicaoForaDaArma > municaoNessecaria)
{
auxMaxMunicaoNaArma += municaoNessecaria;
auxMaxMunicaoForaDaArma -= municaoNessecaria;
}
else
{
auxMaxMunicaoNaArma += auxMaxMunicaoForaDaArma;
auxMaxMunicaoForaDaArma = 0;
}
}
void RecarregarShotgun()
{
if (auxMaxMunicaoNaArma >= maxMunicaoNaArma)
{
auxMaxMunicaoNaArma = maxMunicaoNaArma;
}
if (auxMaxMunicaoNaArma < maxMunicaoNaArma&&auxMaxMunicaoForaDaArma>0)
{
auxMaxMunicaoNaArma += 1;
auxMaxMunicaoForaDaArma -= 1;
}
if (auxMaxMunicaoForaDaArma <= 0)
{
auxMaxMunicaoForaDaArma = 0;
}
}
IEnumerator Tiro()
{
yield return new WaitForSeconds(velocidadeTiro);
podeAtirar = true;
}
}
Min = eh onde a arma vai ficar quando n estiver mirando
Max = eh onde a arma vai ficar quando estiver mirando
MinAux = eh a que vai ficar seguindo o Min
MaxAux = tbem vai ficar seguindo o Max
Funciona com shotgun,metralhadora,revolver talvez com sniper n testei
e a arma ja tem q ta com o braco,mas tbem funciona so a arma
e pra poder recarregar tem chamar a funcao Recarregar se for pra armas que tem cartuchos e pra armas que colocam bala por bala igual a shotgun tem q chamar a funcao RecarregarShotgun isso tudo na animacao nos events.pra shotguns vc deve colocar a animacao de recarregar em loop pra ficar toda hora chamando a funcao recarregarShotgun pq ela carrega uma bala por vez e tem colocar mais linhas de codigo pra poder parar quando chegar no maximo de bala pra n passar e tbem pra parar a animacao de recarregar
diegopds- Mestre
- PONTOS : 3419
REPUTAÇÃO : 52
Idade : 26
Respeito as regras :
Re: [TUTORIAL] Arma tipo a do call of duty
UoW!! que top bro!
gcs13- MembroAvançado
- PONTOS : 2620
REPUTAÇÃO : 29
Idade : 23
Respeito as regras :
Re: [TUTORIAL] Arma tipo a do call of duty
se testo?funciono certinho?gcs13 escreveu:UoW!! que top bro!
diegopds- Mestre
- PONTOS : 3419
REPUTAÇÃO : 52
Idade : 26
Respeito as regras :
Re: [TUTORIAL] Arma tipo a do call of duty
Alguem poderia testa ai?eu n quero ter feito a toa este scripts kk
diegopds- Mestre
- PONTOS : 3419
REPUTAÇÃO : 52
Idade : 26
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Script de arma automatica
» [TUTORIAL] Sistema de colisao de rajadas de energia tipo Dragonball Z
» [TUTORIAL] Sistema de Arma 3D
» [TUTORIAL] Script de arma 2D [Unity]
» [TUTORIAL] Pegar arma do chão ao Aperta E (Unity 5)
» [TUTORIAL] Sistema de colisao de rajadas de energia tipo Dragonball Z
» [TUTORIAL] Sistema de Arma 3D
» [TUTORIAL] Script de arma 2D [Unity]
» [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