2017-06-22 1 views
0

Je fais un jeu descendant 2.5D. J'ai créé un script pour placer des objets sur ma grille. Mais il se comporte vraiment bizarrement. Il s'aligne sur la grille comme il se doit, mais si la grille sur laquelle j'essaie de placer l'objet est sur ou à gauche d'un objet dans le jeu, cela déclenche une collision (Voir GIF):RayCastHit2D provoquant des collisions incohérentes

enter image description here

J'utilise RayCastHit2D pour détecter collissions, ceci est mon script:

public GameObject finalObject; 

private Vector2 mousePos; 
private RaycastHit2D rayHitCollision; 
private RaycastHit2D rayHitInteractive; 
private Renderer rend; 
private Color green; 
private Color red; 

public LayerMask collisionLayer; 
public LayerMask interactiveLayer; 

void Start() 
{ 
    rend = GetComponent<Renderer>(); 
    red = Color.red; 
    red.a = .5f; 

    green = Color.green; 
    green.a = .5f; 

    rend.material.SetColor("_Color", green); 
} 

void Update() 
{ 
    //get pos of mouse 
    mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
    //place object at rounded mouse pos (snapping) 
    transform.position = new Vector2(Mathf.Round(mousePos.x), Mathf.Round(mousePos.y)); 

    if (GameManager.manager.mainState == GameManager.MainState.PLACEMENT) 
    { 
     //In order to collide with object, they must be on same layer, this includes tilemap stuff 

     rayHitCollision = Physics2D.Raycast(transform.position, Vector2.zero, Mathf.Infinity, collisionLayer); 

     //if tile is colliding with other tile show red, REMEMBER THIS IS EFFECTED BY LAYERS 
     if (rayHitCollision.collider != null) 
     { 
      rend.material.SetColor("_Color", red); 
     } 
     //if not colliding, check for mouse press and place 
     else 
     { 
      rend.material.SetColor("_Color", green); 
      if (Input.GetMouseButtonDown(0)) 
      { 
       if (rayHitCollision.collider == null) 
       { 
        //place object 
       } 
      } 
     } 
    } 
} 

afin d'obtenir mes GameObjects pour aligner sur la grille que je devais régler les pivots en bas à droite (si elles sont le centre , ils sont placés à l'intersection de la grille). Cela signifie que je devais personnaliser leur collisionneur comme ceci:

enter image description here

Comme vous pouvez le voir mon collisionneur est exactement une grille (j'utilise 16ppu):

enter image description here

Je suis perplexe ici , est-ce que quelqu'un a la moindre idée de ce qui ne va pas ici? Pourrait être utile d'ajouter, j'ai essayé de changer leurs colliders à la taille 0,9 au lieu de 1, mais cela désactive complètement RaycastHit2D, et je pourrais placer des objets les uns sur les autres, etc.

Répondre

0

Il se peut que grâce à votre alignement, votre raycast tire du coin de la tuile au lieu du centre, ce qui produit des résultats ambigus. Vous pouvez tester ceci en voyant si l'ajout d'un décalage d'une demi-tuile au départ raycast de position fixe ce (pas sûr que + ou -):

rayHitCollision = Physics2D.Raycast(transform.position + new Vector2(0.5f, 0.5f), Vector2.zero, Mathf.Infinity, collisionLayer); 

Ne hésitez pas à downvote si cette réponse est incorrecte. C'est basé sur une intuition et je n'ai pas d'unité sur cette machine pour l'essayer.

+0

Pourquoi devrais-je downvote quelqu'un qui essaie de m'aider :) Cela ressemble à une bonne idée et je vais l'essayer dès que je rentre à la maison! –

+0

Votre intuition semble être dans le bon sens, je l'ai changé pour 'rayHitCollision = Physics2D.Raycast (transform.position + nouveau Vector3 (0.5f, -0.5f, 0), Vector2.zero, Mathf.Infinity, collisionLayer); 'et maintenant la seule collision de déclenchement de grille qui ne devrait pas être est en haut à gauche. Il me semble juste si étrange que je devrais changer de pivots et de choses comme ça juste pour que ça colle à la grille. Pourquoi ne pas pivoter centre snap à la grille ... semble stupide –