Efeito arma giratória
+2
Fluttershy28
Flávio
6 participantes
Página 1 de 1
Efeito arma giratória
bom dia, pretendo fazer uma arma giratoria, ela vai começar a girar sempre a partir de 0 graus no eixo Z.
então ela vai começar a girar ou para cima ou para baixo inicialmente.
toda vez que a arma chegar em 60 graus no eixo z, ela passa a girar no sentido contrario, e vai girando até chegar em -60 graus no eixo z.
Chegou em -60 em z, passa a girar no outro sentido até 60 graus em z, atingiu 60 em z inverte o ghiro e assim vai fazendo essa troca no sentido do giro.
como que eu faço isso via script?
até agora o que consegui fazer:
eu fiz a mudança do sentido do giro por tempo, mas eu queria fazer por detecção do rotation em z, ou seja, quando detectar 60 graus positivos muda o sentido, e quando detectar 60 graus negativos muda de novo. reparem que o canhao começa em 0 graus e gira só até uns -60 graus e volta até 0.
queria iniciar o sentido de giro aleatorio, ou seja, algo que selecione de forma aleatoria entre começar a girar para cima, no sentido positivo até 60 graus, ou girar para baixo no sentido negativo até -60 graus.
seja para qual lado começar, aí vai detectar: se rotation z chegar até +60 vai girar para baixo; se chegar até -60, vai giarar para cima.
o script de giro da arma
o que posso alterar no script?
então ela vai começar a girar ou para cima ou para baixo inicialmente.
toda vez que a arma chegar em 60 graus no eixo z, ela passa a girar no sentido contrario, e vai girando até chegar em -60 graus no eixo z.
Chegou em -60 em z, passa a girar no outro sentido até 60 graus em z, atingiu 60 em z inverte o ghiro e assim vai fazendo essa troca no sentido do giro.
como que eu faço isso via script?
até agora o que consegui fazer:
eu fiz a mudança do sentido do giro por tempo, mas eu queria fazer por detecção do rotation em z, ou seja, quando detectar 60 graus positivos muda o sentido, e quando detectar 60 graus negativos muda de novo. reparem que o canhao começa em 0 graus e gira só até uns -60 graus e volta até 0.
queria iniciar o sentido de giro aleatorio, ou seja, algo que selecione de forma aleatoria entre começar a girar para cima, no sentido positivo até 60 graus, ou girar para baixo no sentido negativo até -60 graus.
seja para qual lado começar, aí vai detectar: se rotation z chegar até +60 vai girar para baixo; se chegar até -60, vai giarar para cima.
o script de giro da arma
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CanhaoScript : MonoBehaviour {
public float duracao;
public float tempo;
public bool positivo;
public float velRotacao;
void Start () {
positivo = false;
}
void Update () {
tempo += Time.deltaTime;
if (tempo >= duracao) {
tempo = 0f;
positivo = !positivo;
}
if (positivo) {
transform.Rotate(0, 0, velRotacao * Time.deltaTime);
}
if (!positivo) {
transform.Rotate(0, 0, -velRotacao * Time.deltaTime);
}
}
}
o que posso alterar no script?
Flávio- MembroAvançado
- PONTOS : 2832
REPUTAÇÃO : 29
Áreas de atuação : Aprendizagem em:
Programação C#;
Pixelart
Respeito as regras :
Re: Efeito arma giratória
Porque você não faz uma animação no blender ou qualquer outro programa? você pouparia 5* o tempo
Fluttershy28- Avançado
- PONTOS : 2753
REPUTAÇÃO : 52
Idade : 27
Áreas de atuação : Modelagem, Animação, Texturização, Design
Respeito as regras :
Re: Efeito arma giratória
Como é uma animação simples, pode ser feito dentro da própria unity mesmo... com o Animator
Isabela- Avançado
- PONTOS : 2836
REPUTAÇÃO : 260
Idade : 24
Respeito as regras :
Re: Efeito arma giratória
Não entendi, sua solução é muito simples: verificar o eixo Z, como você mesmo disse, através de transform.rotation.z :I
NKKF- ProgramadorMaster
- PONTOS : 4819
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: Efeito arma giratória
Souris escreveu:Não entendi, sua solução é muito simples: verificar o eixo Z, como você mesmo disse, através de transform.rotation.z :I
Souris eu até fiz uma verificação do rotation z dessa forma:
- Código:
var rotZ = transform.rotation.z;
if (rotZ > 60f) {
return;
}
if (rotZ < 60f) {
transform.Rotate(0, 0, velRotacao * Time.deltaTime);
}
mas nao está funcionando.
tem que ter um jeito de verificar a rotação em Z, mas o canhao continua rodando mesmo chegando em 60
Flávio- MembroAvançado
- PONTOS : 2832
REPUTAÇÃO : 29
Áreas de atuação : Aprendizagem em:
Programação C#;
Pixelart
Respeito as regras :
Re: Efeito arma giratória
Tenta isso
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rodar : MonoBehaviour {
bool rodar;
public float velocidadeDoGiro = 100f;
Vector3 rotacao;
void Start(){
rodar = true;
transform.localEulerAngles = new Vector3 (0, 0, 0);
rotacao = transform.localEulerAngles;
}
void Update () {
if (rodar == true) {
while (rotacao.z < 60) {
rotacao.z += Time.deltaTime * velocidadeDoGiro;
transform.localEulerAngles = rotacao;
if (rotacao.z >= 60) {
rotacao = new Vector3 (0, 0, 60);
rodar = false;
}
return;
}
}else{
while (rotacao.z > -60) {
rotacao.z -= Time.deltaTime * velocidadeDoGiro;
transform.localEulerAngles = rotacao;
if (rotacao.z <= -60) {
rotacao = new Vector3 (0, 0, -60);
rodar = true;
}
return;
}
}
}
}
Fluttershy28- Avançado
- PONTOS : 2753
REPUTAÇÃO : 52
Idade : 27
Áreas de atuação : Modelagem, Animação, Texturização, Design
Respeito as regras :
Phph09- Profissional
- PONTOS : 3790
REPUTAÇÃO : 240
Idade : 19
Respeito as regras :
Re: Efeito arma giratória
Eu faria por animação também, por ser tão simples. Outra opção fácil seria fazer o canhão ficar mirando pra um objeto com lookAt, e voce só movimentar esse objeto pra cima e pra baixo.
Re: Efeito arma giratória
Desculpem a demora, mais uma vez me afastei porque estava internado no hospital desde 24 de abril.
consegui resolver isso dessa forma:
velRotacao e deixei em 80.
aproveitei e coloquei um efeito de tiros.
em um outro script no mesmo objeto vai ter um gatilho que dispara o giro e as balas, o gatilho é quando aperto a tecla space:
ficou como eu queria
Fluttershy28 seu script tambem funcionou, agora tenho que acrescentar algumas coisas nele para ficar exatamente o efeito que consegui com o meu.
valeu a contribuição de todos!!
consegui resolver isso dessa forma:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CanhaoScript : MonoBehaviour {
public bool positivo;
public float velRotacao;
public float z;
public int numero;
public bool vaiEVolta;
public bool posInicial;
private Transform pontoBala;
private Transform myTr;
void Awake() {
pontoBala = transform.Find("fire");
}
void Start () {
myTr = GetComponent<Transform>();
numero = Random.Range(1, 3);
positivo = false;
vaiEVolta = false;
posInicial = true;
}
IEnumerator VoltarRotacaoZero() {
yield return new WaitForSeconds(8.0f);
posInicial = true;
vaiEVolta = false;
CancelInvoke("AtiraBala");
}
void AtiraBala() {
var prefBala = Resources.Load("Prefabs/Bala");
Instantiate(prefBala, pontoBala.position, transform.rotation);
}
void Update () {
// Gira o canhao para cima ou para baixo conforme o valor aleatório de numero.
if (!posInicial) {
if (!vaiEVolta && numero == 2) {
z = Mathf.MoveTowards(z, -68.71f, Time.deltaTime * velRotacao);
transform.eulerAngles = new Vector3(0, 0, z);
}
if (!vaiEVolta && numero == 1) {
z = Mathf.MoveTowards(z, 68.71f, Time.deltaTime * velRotacao);
transform.eulerAngles = new Vector3(0, 0, z);
}
if (!vaiEVolta) {
if (z >= 68.71f || z <= -68.71f) {
vaiEVolta = true;
numero = 0;
}
}
// Gira vai e volta entre 60 e -60 graus no eixo Z.
if (vaiEVolta) {
if (z >= 68.71f) {
positivo = false;
}
if (z <= -68.71f) {
positivo = true;
}
if (positivo) {
z = Mathf.MoveTowards(z, 68.71f, Time.deltaTime * velRotacao);
transform.eulerAngles = new Vector3(0, 0, z);
}
if (!positivo) {
z = Mathf.MoveTowards(z, -68.71f, Time.deltaTime * velRotacao);
transform.eulerAngles = new Vector3(0, 0, z);
}
}
}
else {
z = Mathf.MoveTowards(z, 0, Time.deltaTime * 20f);
transform.eulerAngles = new Vector3(0, 0, z);
}
}
public void AtivarGiro() {
numero = Random.Range(1, 3);
posInicial = false;
InvokeRepeating("AtiraBala", 0.0f, 0.15f);
StartCoroutine("VoltarRotacaoZero");
}
}
velRotacao e deixei em 80.
aproveitei e coloquei um efeito de tiros.
em um outro script no mesmo objeto vai ter um gatilho que dispara o giro e as balas, o gatilho é quando aperto a tecla space:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CanhaoControle : MonoBehaviour {
private CanhaoScript scrCanhao;
void Start () {
scrCanhao = GetComponent<CanhaoScript>();
}
void Update () {
if (Input.GetKeyDown(KeyCode.Space)) {
scrCanhao.AtivarGiro();
}
}
}
ficou como eu queria
Fluttershy28 seu script tambem funcionou, agora tenho que acrescentar algumas coisas nele para ficar exatamente o efeito que consegui com o meu.
valeu a contribuição de todos!!
Flávio- MembroAvançado
- PONTOS : 2832
REPUTAÇÃO : 29
Áreas de atuação : Aprendizagem em:
Programação C#;
Pixelart
Respeito as regras :
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos