Trago mais uma pergunta de arrastar com o mouse (estou usando o Unity com C #), mas com um detalhe particular menos comum: a existência de obstáculos no meio do caminho através do qual o arrastamento ocorre (espaço 3D, não 2D) .
Deixe-me explicar. Suponha que eu tenha um plano sobre o qual desejo arrastar um cubo chamado "obj". Isso é fácil. Aqui está minha implementação simples para isso:
void Update () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 1000000))
obj.transform.position = new Vector3(hit.point.x,0.25F,hit.point.z);
}
Funciona. No entanto, suponha que eu também tenha alguns outros cubos sobre o avião, que são os obstáculos. Obviamente, quando o jogador move "obj" sobre o avião, esse movimento deve ser bloqueado pelos obstáculos. E então, ao colidir com os obstáculos, "obj" deve se mover apenas cortada para os lados desse obstáculo. Se o mouse for movido e "obj" parar de colidir com obstáculos, o movimento livre de arrastar será retomado novamente.
Para dificultar o desafio, estou tentando conseguir isso sem o uso dos componentes RigidBody nos obstáculos (o objeto arrastado pode tê-lo). Alguma idéia sobre qual é a maneira mais eficiente de conseguir isso? Muito Obrigado!
EDIT: Os comentaristas trouxeram à minha atenção que eu deveria mencionar que os objetos podem girar durante o snap.
EDIT 2: Considerando a dificuldade da formulação original, mudei a questão permitindo o uso de componentes do corpo rígido nos objetos arrastados. A solução simplesmente não pode usar os componentes do corpo rígido nos obstáculos.
Respostas:
É difícil detectar colisões sem a presença de corpos rígidos, mas, como você está usando cubos, pode usar o Bounds.Intersects . A cada atualização, verifique se os limites do objeto arrastado se cruzam com os limites de qualquer obstáculo. Se isso acontecer, você pode tentar o seguinte:
Você nunca para de arrastar o bloco; simplesmente parece ao usuário que o bloco parou de arrastar enquanto cruzava com um obstáculo.
fonte
Sem ter feito isso sozinho, eis o que eu tentaria:
Parece-me que, se você deseja que seu objeto se arraste ao longo de um plano inclinado de um obstáculo, você deve simplesmente fazer com que sua transformação continue seguindo a posição do último hit do raycast.
fonte