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.