Como limitar o ângulo que um objeto pode atingir com Quaternion.LookRotation?
3 participantes
Página 1 de 1
Como limitar o ângulo que um objeto pode atingir com Quaternion.LookRotation?
Estou usando Quaternion.LookRotation para usar na mira de uma arma e usando o mouse para alterar sua localização, como se fosse um morteiro, no qual onde a mira apontar no chão a bala irá chegar. Está tudo funcionando bem exceto por uns bugs que não sei corrigir. Primeiro: a arma atira de costas quanto o Player gira seu corpo em 180º, ignorando a posição que o ele se encontra (inclusive dá pra ele atirar na própria cabeça, o que não é a intenção). Segundo problema: a arma consegue atravessar pontos do corpo do player, como ombros e quadril, acredito q todo o corpo. Alguma sugestão do que estudar ou ver a respeito para corrigir esses problemas?
BigCouve- Iniciante
- PONTOS : 1604
REPUTAÇÃO : 1
Respeito as regras :
Re: Como limitar o ângulo que um objeto pode atingir com Quaternion.LookRotation?
Coloca o seu script aqui que assim a gente pode sugerir umas edições.
Enquanto isso, você pode tentar usar o Mathf.Clamp:
https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html
Enquanto isso, você pode tentar usar o Mathf.Clamp:
https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html
BRGC- ProgramadorMaster
- PONTOS : 3051
REPUTAÇÃO : 59
Idade : 20
Áreas de atuação : C#, C++, C, Flutter
Respeito as regras :
Re: Como limitar o ângulo que um objeto pode atingir com Quaternion.LookRotation?
Procurei a respeito e parece não servir... pois o clamp só aceita parâmetros float, tentei converter o Quaternion pra Vector3 e tentar usar o Clamp mas também não rolou... Bom, código tá aí:BRGC escreveu:Coloca o seu script aqui que assim a gente pode sugerir umas edições.
Enquanto isso, você pode tentar usar o Mathf.Clamp:
https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html
- Código:
[size=14]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SistemaDeTiroFinal : MonoBehaviour
{
// Start is called before the first frame update
public Rigidbody bulletPrefabs;
public GameObject cursor;
public LayerMask layer;
public Transform shootPoint;
public float alcanceponteiromouse=100;
public float curvaturaTiro = 1f;
private Camera cam;
private Vector3 cu;
public int DanoTiro;
public Rigidbody bala;
public int quantidadeMunicaoPente;
public int quantidadeMunicaoIntentario;
public int LimitePente = 10;
public bool podeAtirar = true;
public bool single_auto;
public int forceshot=1;
public float tempBalaEspera=0.2f;
public static Vector3 PosicaoDeSaida;
IEnumerator DeixarVerdadeira(){
yield return new WaitForSeconds(tempBalaEspera);
podeAtirar=true;
}
void automatico(){
if(single_auto == false && Input.GetKey(KeyCode.Mouse0) && quantidadeMunicaoPente>0 && podeAtirar==true){
Rigidbody obj = Instantiate(bulletPrefabs, shootPoint.position, Quaternion.identity);
obj.velocity = cu * forceshot;
podeAtirar=false;
quantidadeMunicaoPente --;
StartCoroutine ("DeixarVerdadeira");
}
}
void singleManual(){
if(single_auto == true && Input.GetKeyDown(KeyCode.Mouse0) && quantidadeMunicaoPente>0 && podeAtirar==true){
Rigidbody obj = Instantiate(bulletPrefabs, shootPoint.position, Quaternion.identity);
obj.velocity = cu * forceshot;
podeAtirar = false;
quantidadeMunicaoPente --;
StartCoroutine ("DeixarVerdadeira");
}
}
void RecarregarArma(){
if(quantidadeMunicaoPente == 0 && quantidadeMunicaoIntentario > 1){
quantidadeMunicaoIntentario=(quantidadeMunicaoIntentario - LimitePente);
quantidadeMunicaoPente=LimitePente;
}
else if(quantidadeMunicaoPente > 0 && quantidadeMunicaoIntentario > 1){
quantidadeMunicaoIntentario=(quantidadeMunicaoIntentario - LimitePente)+quantidadeMunicaoPente;
quantidadeMunicaoPente=LimitePente;
}
else if(quantidadeMunicaoIntentario == 0 && quantidadeMunicaoIntentario == 0){
Debug.Log("Sem munição");
}
}
void Start()
{
cam= Camera.main;
}
// Update is called once per frame
void Update()
{
LaunchProjectile();
if(Input.GetKeyDown(KeyCode.R)){
RecarregarArma();
}
}
void LaunchProjectile (){
Ray camRay = cam.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
Vector3 halfTurnNEG = new Vector3(-180f, -180f, -180f);
Vector3 halfTurnPOS = new Vector3(180f, 180f, 180f);
if (Physics.Raycast(camRay, out hit , alcanceponteiromouse, layer)){
cursor.SetActive(true);
cursor.transform.position = hit.point + Vector3.up * 0.1f;
Vector3 Vo = CalculateVelocity(hit.point, shootPoint.position, curvaturaTiro);
cu=Vo;
transform.rotation = Quaternion.LookRotation(Vo);
switch (single_auto)
{
case true:
singleManual();
break;
case false:
automatico();
break;}
}
else if(hit.collider==null) {
PosicaoDeSaida = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f));
Vector3 novaposicao = shootPoint.forward * 1000;
Vector3 Vo = CalculateVelocity(PosicaoDeSaida, shootPoint.position, curvaturaTiro);
cu=Vo;
Debug.Log("tudo saindo top");
transform.rotation = Quaternion.LookRotation(Vo);
switch (single_auto)
{
case true:
singleManual();
break;
case false:
automatico();
break;}
}
}
Vector3 CalculateVelocity(Vector3 target, Vector3 origin, float time){
Vector3 distance = target - origin;
Vector3 distanceXZ = distance;
distanceXZ.y = 0f;
float Sy = distance.y;
float Sxz = distanceXZ.magnitude;
float Vxz = Sxz / time;
float Vy = Sy / time + 0.5f * Mathf.Abs(Physics.gravity.y) * time;
Vector3 result = distanceXZ.normalized;
result *= Vxz;
result.y = Vy;
return result;
}
}
[/size]
BigCouve- Iniciante
- PONTOS : 1604
REPUTAÇÃO : 1
Respeito as regras :
Re: Como limitar o ângulo que um objeto pode atingir com Quaternion.LookRotation?
Você pode fazer o que esse post sugeriu: https://stackoverflow.com/questions/56007647/limit-angle-of-transform-lookat-at-x-axis-and-not-limiting-the-rotation-of-axe
O que resultaria em algo mais ou menos assim (dei uma modificação geral no código):
No código ele está limitando o ângulo em -30 e 30 graus.
É meio complicado resolver um problema sem dados visuais do que está acontecendo ou não em seu jogo, tenta enviar umas imagens caso ainda continue dando algo errado ou me chama lá no Discord que a gente vê essa parada juntos: NKKF#1792
O que resultaria em algo mais ou menos assim (dei uma modificação geral no código):
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SistemaDeTiroFinal : MonoBehaviour {
public Rigidbody bulletPrefabs;
public GameObject cursor;
public LayerMask layer;
public Transform shootPoint;
public float alcanceponteiromouse = 100;
public float curvaturaTiro = 1f;
private Camera cam;
private Vector3 cu;
public int DanoTiro;
public Rigidbody bala;
public int quantidadeMunicaoPente;
public int quantidadeMunicaoIntentario;
public int LimitePente = 10;
public bool podeAtirar = true;
public bool single_auto;
public int forceshot = 1;
public float tempBalaEspera = 0.2f;
public static Vector3 PosicaoDeSaida;
IEnumerator DeixarVerdadeira () {
yield return new WaitForSeconds (tempBalaEspera);
podeAtirar = true;
}
void automatico () {
if (single_auto == false && Input.GetKey (KeyCode.Mouse0) && quantidadeMunicaoPente > 0 && podeAtirar == true) {
Rigidbody obj = Instantiate (bulletPrefabs, shootPoint.position, Quaternion.identity);
obj.velocity = cu * forceshot;
podeAtirar = false;
quantidadeMunicaoPente--;
StartCoroutine ("DeixarVerdadeira");
}
}
void singleManual () {
if (single_auto == true && Input.GetKeyDown (KeyCode.Mouse0) && quantidadeMunicaoPente > 0 && podeAtirar == true) {
Rigidbody obj = Instantiate (bulletPrefabs, shootPoint.position, Quaternion.identity);
obj.velocity = cu * forceshot;
podeAtirar = false;
quantidadeMunicaoPente--;
StartCoroutine ("DeixarVerdadeira");
}
}
void RecarregarArma () {
if (quantidadeMunicaoPente == 0 && quantidadeMunicaoIntentario > 1) {
quantidadeMunicaoIntentario = (quantidadeMunicaoIntentario - LimitePente);
quantidadeMunicaoPente = LimitePente;
} else if (quantidadeMunicaoPente > 0 && quantidadeMunicaoIntentario > 1) {
quantidadeMunicaoIntentario = (quantidadeMunicaoIntentario - LimitePente) + quantidadeMunicaoPente;
quantidadeMunicaoPente = LimitePente;
} else if (quantidadeMunicaoIntentario == 0 && quantidadeMunicaoIntentario == 0) {
Debug.Log ("Sem munição");
}
}
private void OnEnable () {
cam = Camera.main;
}
private void Update () {
LaunchProjectile ();
if (Input.GetKeyDown (KeyCode.R)) {
RecarregarArma ();
}
}
void LaunchProjectile () {
Ray camRay = cam.ScreenPointToRay (Input.mousePosition);
Vector3 halfTurnNEG = Vector3.one * -180f,
halfTurnPOS = Vector3.one * 180f;
RaycastHit hit;
if (Physics.Raycast (camRay, out hit, alcanceponteiromouse, layer)) {
cursor.SetActive (true);
cursor.transform.position = hit.point + Vector3.up * 0.1f;
Vector3 Vo = CalculateVelocity (hit.point, shootPoint.position, curvaturaTiro);
cu = Vo;
Quaternion rotation = Quaternion.LookRotation (Vo);
rotation.eulerAngles = new Vector3 (Mathf.Clamp (rotation.eulerAngles.x, -30, 30), rotation.eulerAngles.y, rotation.eulerAngles.z);
transform.rotation = rotation;
if (single_auto) {
singleManual ();
} else {
automatico ();
}
} else if (hit.collider == null) {
PosicaoDeSaida = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 10f));
Vector3 novaposicao = shootPoint.forward * 1000;
Vector3 Vo = CalculateVelocity (PosicaoDeSaida, shootPoint.position, curvaturaTiro);
cu = Vo;
Debug.Log ("tudo saindo top");
transform.rotation = Quaternion.LookRotation (Vo);
if (single_auto) {
singleManual ();
} else {
automatico ();
}
}
}
Vector3 CalculateVelocity (Vector3 target, Vector3 origin, float time) {
Vector3 distance = target - origin;
Vector3 distanceXZ = distance;
distanceXZ.y = 0f;
float Sy = distance.y;
float Sxz = distanceXZ.magnitude;
float Vxz = Sxz / time;
float Vy = Sy / time + 0.5f * Mathf.Abs (Physics.gravity.y) * time;
Vector3 result = distanceXZ.normalized;
result *= Vxz;
result.y = Vy;
return result;
}
}
No código ele está limitando o ângulo em -30 e 30 graus.
É meio complicado resolver um problema sem dados visuais do que está acontecendo ou não em seu jogo, tenta enviar umas imagens caso ainda continue dando algo errado ou me chama lá no Discord que a gente vê essa parada juntos: NKKF#1792
NKKF- ProgramadorMaster
- PONTOS : 4817
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: Como limitar o ângulo que um objeto pode atingir com Quaternion.LookRotation?
Ainda não deu certo, inclusive alterei o ângulo pra 180 mas não resolveu também, talvez não seja isso o certo kkj. Bom, te mandei solicitação lá no Discord, BigCouve#5667NKKF escreveu:Você pode fazer o que esse post sugeriu: https://stackoverflow.com/questions/56007647/limit-angle-of-transform-lookat-at-x-axis-and-not-limiting-the-rotation-of-axe
O que resultaria em algo mais ou menos assim (dei uma modificação geral no código):
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SistemaDeTiroFinal : MonoBehaviour {
public Rigidbody bulletPrefabs;
public GameObject cursor;
public LayerMask layer;
public Transform shootPoint;
public float alcanceponteiromouse = 100;
public float curvaturaTiro = 1f;
private Camera cam;
private Vector3 cu;
public int DanoTiro;
public Rigidbody bala;
public int quantidadeMunicaoPente;
public int quantidadeMunicaoIntentario;
public int LimitePente = 10;
public bool podeAtirar = true;
public bool single_auto;
public int forceshot = 1;
public float tempBalaEspera = 0.2f;
public static Vector3 PosicaoDeSaida;
IEnumerator DeixarVerdadeira () {
yield return new WaitForSeconds (tempBalaEspera);
podeAtirar = true;
}
void automatico () {
if (single_auto == false && Input.GetKey (KeyCode.Mouse0) && quantidadeMunicaoPente > 0 && podeAtirar == true) {
Rigidbody obj = Instantiate (bulletPrefabs, shootPoint.position, Quaternion.identity);
obj.velocity = cu * forceshot;
podeAtirar = false;
quantidadeMunicaoPente--;
StartCoroutine ("DeixarVerdadeira");
}
}
void singleManual () {
if (single_auto == true && Input.GetKeyDown (KeyCode.Mouse0) && quantidadeMunicaoPente > 0 && podeAtirar == true) {
Rigidbody obj = Instantiate (bulletPrefabs, shootPoint.position, Quaternion.identity);
obj.velocity = cu * forceshot;
podeAtirar = false;
quantidadeMunicaoPente--;
StartCoroutine ("DeixarVerdadeira");
}
}
void RecarregarArma () {
if (quantidadeMunicaoPente == 0 && quantidadeMunicaoIntentario > 1) {
quantidadeMunicaoIntentario = (quantidadeMunicaoIntentario - LimitePente);
quantidadeMunicaoPente = LimitePente;
} else if (quantidadeMunicaoPente > 0 && quantidadeMunicaoIntentario > 1) {
quantidadeMunicaoIntentario = (quantidadeMunicaoIntentario - LimitePente) + quantidadeMunicaoPente;
quantidadeMunicaoPente = LimitePente;
} else if (quantidadeMunicaoIntentario == 0 && quantidadeMunicaoIntentario == 0) {
Debug.Log ("Sem munição");
}
}
private void OnEnable () {
cam = Camera.main;
}
private void Update () {
LaunchProjectile ();
if (Input.GetKeyDown (KeyCode.R)) {
RecarregarArma ();
}
}
void LaunchProjectile () {
Ray camRay = cam.ScreenPointToRay (Input.mousePosition);
Vector3 halfTurnNEG = Vector3.one * -180f,
halfTurnPOS = Vector3.one * 180f;
RaycastHit hit;
if (Physics.Raycast (camRay, out hit, alcanceponteiromouse, layer)) {
cursor.SetActive (true);
cursor.transform.position = hit.point + Vector3.up * 0.1f;
Vector3 Vo = CalculateVelocity (hit.point, shootPoint.position, curvaturaTiro);
cu = Vo;
Quaternion rotation = Quaternion.LookRotation (Vo);
rotation.eulerAngles = new Vector3 (Mathf.Clamp (rotation.eulerAngles.x, -30, 30), rotation.eulerAngles.y, rotation.eulerAngles.z);
transform.rotation = rotation;
if (single_auto) {
singleManual ();
} else {
automatico ();
}
} else if (hit.collider == null) {
PosicaoDeSaida = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 10f));
Vector3 novaposicao = shootPoint.forward * 1000;
Vector3 Vo = CalculateVelocity (PosicaoDeSaida, shootPoint.position, curvaturaTiro);
cu = Vo;
Debug.Log ("tudo saindo top");
transform.rotation = Quaternion.LookRotation (Vo);
if (single_auto) {
singleManual ();
} else {
automatico ();
}
}
}
Vector3 CalculateVelocity (Vector3 target, Vector3 origin, float time) {
Vector3 distance = target - origin;
Vector3 distanceXZ = distance;
distanceXZ.y = 0f;
float Sy = distance.y;
float Sxz = distanceXZ.magnitude;
float Vxz = Sxz / time;
float Vy = Sy / time + 0.5f * Mathf.Abs (Physics.gravity.y) * time;
Vector3 result = distanceXZ.normalized;
result *= Vxz;
result.y = Vy;
return result;
}
}
No código ele está limitando o ângulo em -30 e 30 graus.
É meio complicado resolver um problema sem dados visuais do que está acontecendo ou não em seu jogo, tenta enviar umas imagens caso ainda continue dando algo errado ou me chama lá no Discord que a gente vê essa parada juntos: NKKF#1792
BigCouve- Iniciante
- PONTOS : 1604
REPUTAÇÃO : 1
Respeito as regras :
Tópicos semelhantes
» Como limitar o angulo de rotação de um objeto?
» Como limitar ate onde a câmera do unity2D pode ir?
» Como posso movimentar meu personagem sempre 1 f no angulo X
» Restringir a Rotação de um objeto até um certo ângulo!
» Como usar o LookRotation
» Como limitar ate onde a câmera do unity2D pode ir?
» Como posso movimentar meu personagem sempre 1 f no angulo X
» Restringir a Rotação de um objeto até um certo ângulo!
» Como usar o LookRotation
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos