Alguém sabe reproduzir esse efeito do video na Unity?
2 participantes
Página 1 de 1
Alguém sabe reproduzir esse efeito do video na Unity?
Eu tentei de todas as formas reproduzir o efeito dos "Weeping Angels" na Unity, até mesmo utilizando o script desse tutorial, mas por algum motivo o inimigo não sai do lugar quando está fora do campo de visão, alguém saberia como fazer funcionar? Se souber poderia me explicar o que está impedindo de funcionar o script, porque não da nem um erro sequer na hora de executá-lo. Vou deixar o video do tutorial e o script abaixo. P.S.: a versão do meu Unity é a 2019.4.26f1.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AngelTeleport : MonoBehaviour
{
public GameObject playerRef;
// Start is called before the first frame update
void Start()
{
playerRef = GameObject.FindGameObjectWithTag("Player");
}
void OnBecameInvisible()
{
if (playerRef != null)
{
transform.position = playerRef.transform.position - playerRef.transform.forward;
Vector3 lookPos = playerRef.transform.position - transform.position;
lookPos.y = 0;
transform.rotation = Quaternion.LookRotation(lookPos);
}
}
}
AmazingDeliciano- Membro
- PONTOS : 1773
REPUTAÇÃO : 3
Respeito as regras :
Re: Alguém sabe reproduzir esse efeito do video na Unity?
O efeito é bem mais completo que o vídeo que você postou...
Primeiro, elas não se movem se algo está bloqueando seu campo de visão, então se tiver uma parede entre vocês ou uma coluna, ela não pode se mover.
A "pose" muda sempre que ela se move.
O movimento é gradual, não é como no exemplo, que de uma vez só já se move pra frente do player.
Sobre o script, usar a OnBecameInvisible só garante que o objeto saiu do frustrum da câmera, (visão mínima, visão max, e ângulo max), mas se ela tiver atrás de alguma parede e invisível pra você, pra unity o objeto ainda está marcado como "visible".
Pra deixar como na série, você teria que fazer uma sequência de checagens:
distância => pra elas não se moverem se você tiver andando bem longe de onde elas estão.
ângulo => Ângulo em relação a frente da câmera, serve pra checar se você está de costas pro anjo.
visibilidade/bloqueio => pra não se moverem caso tenha uma parede ou algo bloqueando a visão mesmo que você esteja de costas.
Sempre que puder se mover, o ideal seria usar algum valor de distância conforme o tempo não visível, pra não ir pro colo do player de uma vez, dependendo da complexidade da sala onde vocês estiverem talvez seja preciso usar Navmesh.
No teste abaixo, as checagens de distância e ângulo são bem simples, a única coisa que vale a pena citar é a checagem de visibilidade, uma forma rápida e aproximada de checar isso é disparando um raycast em direção a partes específicas do corpo, como as mãos, pernas, pontas das asas e cabeça, se todos os raios baterem em algo, ela está completamente oculta por algum objeto. a checagem não é perfeita, mas é leve e dá um resultado aceitável.
note que apenas o anjo que está com uma parede na frente não se move mesmo que eu esteja olhando pra outro lado.
o ângulo foi deixado bem baixo de propósito, pro movimento aparecer na câmera, mas é só subir pra 60 que você não vê o anjo se mover.
Sobre as poses, você cria várias no Blender, inicia seu Animator num state vazio e só muda o state de forma aleatória cada vez que o anjo passar por todas as checagens e se mover.
O script ficou assim:
O Angels manager é quem faz as checagens, o anjo em si só se coloca na lista do manager e se move.
NomePoses é um array de string, nele você coloca o nome de cada state com uma pose, não o nome da animação em si, aqui tem uma foto de como ficou meu Animator:
e aqui a configuração do Inspector do anjo, note que usei os ossos como os pontos de checagem de visibilidade:
Primeiro, elas não se movem se algo está bloqueando seu campo de visão, então se tiver uma parede entre vocês ou uma coluna, ela não pode se mover.
A "pose" muda sempre que ela se move.
O movimento é gradual, não é como no exemplo, que de uma vez só já se move pra frente do player.
Sobre o script, usar a OnBecameInvisible só garante que o objeto saiu do frustrum da câmera, (visão mínima, visão max, e ângulo max), mas se ela tiver atrás de alguma parede e invisível pra você, pra unity o objeto ainda está marcado como "visible".
Pra deixar como na série, você teria que fazer uma sequência de checagens:
distância => pra elas não se moverem se você tiver andando bem longe de onde elas estão.
ângulo => Ângulo em relação a frente da câmera, serve pra checar se você está de costas pro anjo.
visibilidade/bloqueio => pra não se moverem caso tenha uma parede ou algo bloqueando a visão mesmo que você esteja de costas.
Sempre que puder se mover, o ideal seria usar algum valor de distância conforme o tempo não visível, pra não ir pro colo do player de uma vez, dependendo da complexidade da sala onde vocês estiverem talvez seja preciso usar Navmesh.
No teste abaixo, as checagens de distância e ângulo são bem simples, a única coisa que vale a pena citar é a checagem de visibilidade, uma forma rápida e aproximada de checar isso é disparando um raycast em direção a partes específicas do corpo, como as mãos, pernas, pontas das asas e cabeça, se todos os raios baterem em algo, ela está completamente oculta por algum objeto. a checagem não é perfeita, mas é leve e dá um resultado aceitável.
note que apenas o anjo que está com uma parede na frente não se move mesmo que eu esteja olhando pra outro lado.
o ângulo foi deixado bem baixo de propósito, pro movimento aparecer na câmera, mas é só subir pra 60 que você não vê o anjo se mover.
Sobre as poses, você cria várias no Blender, inicia seu Animator num state vazio e só muda o state de forma aleatória cada vez que o anjo passar por todas as checagens e se mover.
O script ficou assim:
- Código:
using UnityEngine;
public class WeepingAngel : MonoBehaviour
{
public string[] nomePoses;
public Animator anim;
public Transform[] pontosChecagem;
private void Start()
{
AlterarPose();
FindObjectOfType<AngelsManager>().AdicionarAnjo(this);
}
public void PodeMover(Transform player)
{
Vector3 pos = player.position - transform.position;
pos.y = transform.position.y;
if (pos.magnitude > 1.5f)
{
Vector3 deslocamento = (player.position - transform.position).normalized;
deslocamento.y = transform.position.y;
transform.rotation = Quaternion.LookRotation(deslocamento, Vector3.up);
transform.position += deslocamento;
AlterarPose();
}
}
private void AlterarPose()
{
anim.Play(nomePoses[Random.Range(0, nomePoses.Length)]);
}
}
- Código:
using System.Collections.Generic;
using UnityEngine;
public class AngelsManager : MonoBehaviour
{
public Transform player;
public float distanciaMinima = 30;
public float anguloMin = 45;
private List<WeepingAngel> anjos = new List<WeepingAngel>();
public void AdicionarAnjo(WeepingAngel anjo)
{
anjos.Add(anjo);
}
private void Start()
{
InvokeRepeating(nameof(UpdateAnjos), 0.5f, 0.5f);
}
private void UpdateAnjos()
{
for (int i = 0; i < anjos.Count; i++)
{
if (ChecarDistanciaMinima(anjos[i]))
{
if (ChecarAnguloMinimo(anjos[i]))
{
if (ChecarVisibilidade(anjos[i]))
{
anjos[i].PodeMover(player);
}
}
}
}
}
private bool ChecarDistanciaMinima(WeepingAngel anjo)
{
return (Vector3.Distance(player.position, anjo.transform.position) < distanciaMinima);
}
private bool ChecarAnguloMinimo(WeepingAngel anjo)
{
return (Vector3.Angle(player.forward, (anjo.transform.position - player.position).normalized) > anguloMin);
}
private bool ChecarVisibilidade(WeepingAngel anjo)
{
Transform[] t = anjo.pontosChecagem;
int cont = 0;
for (int i = 0; i < t.Length; i++)
{
Vector3 dir = t[i].position - player.position;
Ray ray = new Ray() { origin = player.position, direction = (t[i].position - player.position).normalized};
if(Physics.Raycast(ray, dir.magnitude))
{
cont++;
}
}
return cont != t.Length;
}
}
O Angels manager é quem faz as checagens, o anjo em si só se coloca na lista do manager e se move.
NomePoses é um array de string, nele você coloca o nome de cada state com uma pose, não o nome da animação em si, aqui tem uma foto de como ficou meu Animator:
e aqui a configuração do Inspector do anjo, note que usei os ossos como os pontos de checagem de visibilidade:
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Alguém sabe reproduzir esse efeito do video na Unity?
Uau, isso sim é uma explicação completa, vou tentar aqui pra ver se vai funcionar normalmente. Muito obrigado, Fagner!
AmazingDeliciano- Membro
- PONTOS : 1773
REPUTAÇÃO : 3
Respeito as regras :
Tópicos semelhantes
» Alguém sabe como corrigir esse bug visual na interface do editor da unity?
» Alguém sabe o nome desse efeito?
» ALGUEM SABE RESOLVER ESSE ERRO?
» Alguem sabe como fazer um efeito submerso ou em baixo da agua
» Alguém sabe como conseguir esse mesmo resultado?
» Alguém sabe o nome desse efeito?
» ALGUEM SABE RESOLVER ESSE ERRO?
» Alguem sabe como fazer um efeito submerso ou em baixo da agua
» Alguém sabe como conseguir esse mesmo resultado?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos