I 'm making a 3D trap, two walls that close towards each other on regular intervals.
Used the rigid body on then to push any player inside, and was working greatly first until I duplicated and shifted its rotation
There is a parent witch the script, and 2 walls as child. I pick theirs rb and start moving with .MovePosition based on the fathers position + distance from the middle.
Tested if the positions are right with gizmos and seem ok, so I clearly didn’t get rbs right…
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParedeEsmaga : MonoBehaviour
{
[HideInInspector] public float distanciaInicial;
[HideInInspector] public float velocidadeFechamento;
[SerializeField] private float distanciaFechamento;
[SerializeField] private float distanciaMinima = 7.4f;
[SerializeField] private bool fechando;
[SerializeField] private GameObject paredeEsquerda;
[SerializeField] private GameObject paredeDireita;
private Rigidbody pErb;
private Rigidbody pDrb;
private BoxCollider colisaoTrigger;
// Start is called before the first frame update
void Start()
{
distanciaFechamento = distanciaInicial;
pErb = paredeEsquerda.GetComponent<Rigidbody>();
pDrb = paredeDireita.GetComponent<Rigidbody>();
pDrb.isKinematic = true;
pErb.isKinematic = true;
colisaoTrigger = GetComponent<BoxCollider>();
}
// Update is called once per frame
void FixedUpdate()
{
//abre e fecha a armadilha
_Fechamento();
}
public void _DistanciaInicial(float distancia)
{
if (distanciaInicial != distancia)
{
Vector3 posicaoEsquerda = new Vector3(0, 0, -distancia);
Vector3 posicaoDireita = new Vector3(0, 0, distancia);
paredeEsquerda.transform.localPosition = (posicaoEsquerda);
paredeDireita.transform.localPosition = (posicaoDireita);
distanciaInicial = distancia;
}
}
public void _Fechamento()
{
//se fechando, vai fechar a armadilha ate a diferença da distancia ser menor que a minima
if (fechando)
{
distanciaFechamento -= velocidadeFechamento * Time.fixedDeltaTime;
if (distanciaFechamento < distanciaMinima)
{
fechando = false;
distanciaFechamento = distanciaMinima;
}
}
else // do contrario vai abrir ate ser maior que a distancia inicial
{
distanciaFechamento += velocidadeFechamento * Time.fixedDeltaTime;
if (distanciaFechamento >= distanciaInicial)
fechando = true;
}
//cria o vertor para cada lado da armadilha
Vector3 posicaoEsquerda = new Vector3(0, 0, -distanciaFechamento);
Vector3 posicaoDireita = new Vector3(0, 0, distanciaFechamento);
//move pelo rigidbody se baseando na posição central + o vetor de movimento conciderando a direção do prefab
pErb.MovePosition(transform.position + transform.TransformDirection(posicaoEsquerda));
pDrb.MovePosition(transform.position + transform.TransformDirection(posicaoDireita));
gizmoPosicaoEsquerda = (transform.position + transform.TransformDirection(posicaoEsquerda));
gizmoPosicaoDireita = (transform.position + transform.TransformDirection(posicaoDireita));
//por algum motivo, o rigid body não se move para a posição correta, equanto os gizmo confirmam que esta certo
Debug.Log(transform.position + " + " + transform.TransformDirection(posicaoEsquerda) + " = " + (transform.position + transform.TransformDirection(posicaoEsquerda)) + " " + Time.frameCount);
}
private void OnTriggerStay(Collider other)
{
if(other.CompareTag("Player") && distanciaFechamento - distanciaMinima < colisaoTrigger.size.z)
{
RB_PlayerController player = other.GetComponent<RB_PlayerController>();
player._Morre();
}
}
private Vector3 gizmoPosicaoEsquerda;
private Vector3 gizmoPosicaoDireita;
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawSphere(gizmoPosicaoEsquerda, 1);
Gizmos.DrawSphere(gizmoPosicaoDireita, 1);
}
}