La détection d'un objet avec Raycast2D
Je travaille sur une stratégie simple mécanique de jeu. J'ai une Caserne de la préfabrication. Quand j'ajoute de la Caserne sur la scène et cliquez sur la Caserne, je reçois un NullReferenceException
erreur:
NullReferenceException: la référence d'Objet n'est pas définie à une instance d'un objet PlacementController.Mise à jour () (Assets/Scripts/PlacementController.cs:64)
L'erreur est reçu lorsque j'essaie d'atteindre collisionneur nom de la Caserne à l'aide de Raycast2D.
Caserne de la préfabrication a une Boîte Collider2D collider(trigger est cochée) et son étiquette est "Bâtiment" et sa couche est "Bâtiments". Il a un rigidbody2D composant et c'est une cinématique rigidbody.
Je ne peux pas comprendre ce problème. S'il vous plaît aider moi.
Merci pour votre temps.
using UnityEngine;
using System.Collections;
public class PlacementController : MonoBehaviour
{
private Buildings buildings;
private Transform currentBuilding;
private bool _hasPlaced;
public LayerMask BuildingsMask;
public void SelectBuilding(GameObject g)
{
_hasPlaced = false;
currentBuilding = ((GameObject)Instantiate(g)).transform;
buildings = currentBuilding.GetComponent<Buildings>();
}
bool CheckPosition()
{
if (buildings.CollidersList.Count > 0)
{
return false;
}
return true;
}
//Update is called once per frame
void Update () {
Vector3 m = Input.mousePosition;
m = new Vector3(m.x, m.y, transform.position.z);
Vector3 p = GetComponent<Camera>().ScreenToWorldPoint(m);
if (currentBuilding != null && !_hasPlaced)
{
currentBuilding.position = new Vector3(p.x,p.y,0);
if (Input.GetMouseButtonDown(0))
{
if (CheckPosition())
{
_hasPlaced = true;
}
}
}
else
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit2D hit = new RaycastHit2D();
Ray2D ray2D = new Ray2D(new Vector2(p.x,p.y), Vector3.down );
//Ray2D ray = new Ray(transform.position,new Vector3(p.x,p.y,p.z));
if (Physics2D.Raycast(new Vector2(p.x,p.y),Vector3.down,5.0f,BuildingsMask) )
{
Debug.Log(hit.collider.name); //error
}
}
}
}
------------------ Je suis le partage de réponse, et merci pour votre aide --------------------
if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
{
RaycastHit2D hit = new RaycastHit2D();
Ray2D ray2D = new Ray2D(new Vector2(p.x,p.y), Vector3.down );
hit = Physics2D.Raycast(new Vector2(p.x, p.y), Vector3.forward, 5.0f, BuildingsMask);
Debug.Log(hit.collider.name);
}
OriginalL'auteur Halil Cosgun | 2015-04-19
Vous devez vous connecter pour publier un commentaire.
L'unité dispose de deux moteurs de physique, qui sont très similaires, mais c'est un domaine où elles sont différentes dans un subtil et déroutant.
Le moteur 3D offre
de la Physique.Raycast
, qui renvoietrue
sur le coup, oufalse
autrement, et vous permet de passer unRaycastHit
par référence si vous avez besoin d'en savoir plus sur le coup.Le moteur 2D offre
Physics2D.Raycast
, qui renvoie uneRaycastHit2D
sur le coup, ounull
autrement. La façon dont votre code est écrit, lehit
vous l'accès n'est pas le même frappé qui a été renvoyé par le raycast appel.Donc, vous avez besoin de quelque chose de plus près à ceci:
(Vous remarquerez peut-être que
RaycastHit2D
a une conversion implicite enbool
.)L'unité n'avait que le moteur 3D pour une longue période, de sorte que beaucoup d'anciens de la documentation vous parlez comme si c'est le seul. Attention pour que.
OriginalL'auteur rutter
Avec la nouvelle INTERFACE utilisateur du système, vous n'avez pas à gérer les clics manuellement comme ça. Mettre en œuvre IPointerClickHandler sur votre MonoBehaviour, et de s'assurer qu'il n'y a EventSystem et PhysicsRaycaster présents dans la scène.
OriginalL'auteur Max Yankov
OK! j'ai vérifier tous les accès à internet, et aucun de comprendre ce que les gens vraiment besoin, quand vous parlez abour raycast2D, j'ai enfin trouver ce dont ils ont besoin, de prendre, et d'être heureux )) malade, essayez de poster la réponse de partout, donc les gens peuvent facilement trouver si besoin.
À partir de la caméra de l'écran 2D sprite, sprite, doit être à tout collider, rigidbody sur sprite a pas besoin.
Ensuite choisi obj.
Mettre le script sur l'appareil photo, maintenant tout le monde sera heureux, couse à internet, même unity3D communauté de ne pas comprendre ce que les gens vraiment besoins avec raycast2D, l'espoir peut-être que dans le futur ils vont rendre cette fonction plus facile ))
OriginalL'auteur анонимно
Merci @анонимно, votre réponse fonctionne plutôt bien pour moi, j'étais juste besoin de frapper un rayon avec la mousePosition et de savoir si cette position de frappe avec 2D gameObject, comme un sprite.
Je vais appeler ce hit en OnMouseUp() la méthode.
OriginalL'auteur Emisael Carrera