#c# #unity3d
Вопрос:
Вот код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RaycastControl : MonoBehaviour
{
LineRenderer line;
private Vector3 zeros;
public LayerMask EnemyLayer;
// Start is called before the first frame update
void Start()
{
line = GetComponent<LineRenderer>();
zeros = new Vector3(0f, 0f, 0f);
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Debug.Log("Detected the click");
Vector3 mouse = mouseToWorld(Input.mousePosition);
Ray ray = new Ray(zeros, mouse);
RaycastHit hitData;
if (Physics.Raycast(ray, 10000, EnemyLayer))
{
Vector3[] linePos = new Vector3[] { transform.position, mouse };
line.SetPositions(linePos);
Debug.Log("You've hit a Zomboid!");
}
}
}
public Vector3 mouseToWorld(Vector3 mousePos)
{
mousePos = Input.mousePosition;
mousePos.z = Camera.main.nearClipPlane;
Vector3 mouse = Camera.main.ScreenToWorldPoint(mousePos);
mouse.z = 0f;
return mouse;
}
}
Примечание: Я использую Unity2d
Я пытаюсь использовать 0,0,0 и местоположение моей мыши, чтобы отбросить луч, начиная с 0,0,0 и проходя через местоположение мыши на указанное максимальное расстояние в if(физика.Raycast(луч,максимальное расстояние,вражеский слой)). однако это не работает. Когда я нажимаю на объект «Зомби», который я создал, или за ним, я не обнаруживаю попадание в радиопередачу.
Я был уверен, что маска слоя, установленная в этом сценарии, совпадает с маской, установленной в объекте Зомби. Мой Debug.Log(«Вы зашли так далеко!»); строка активируется, чтобы я знал, что сценарий находится в сцене и читается, но Физика.Raycast(луч,10000,вражеский слой)) НИКОГДА не возвращает true, и мы знаем это, потому что Debug.Log(«Вы попали в зомбоид!») никогда не отображается в консоли.
Примечание: Объект, к которому прикреплен этот скрипт, в центре, находится на 0,0,0. его преобразование.положение = 0,0,0
Мы очень ценим вашу помощь.
Комментарии:
1. Вы пытаетесь попасть в столкновение2d? В этом случае вам скорее понадобится использовать
Physics2D.Raycast
!2. В дополнение к вышесказанному помните, что
Physics/2D.Raycast
принимает aLayerMask
для выборочного игнорирования слоев. Если все биты в маске слоя включены, она столкнется со всеми коллайдерами. Если LayerMask = 0, он никогда не обнаружит никаких столкновений с лучом.3. @дерХуго прав. Я должен был использовать физику. 2D для 2d-боксового коллайдера. Я не понимал, что он не может работать с 2d-боксовыми коллайдерами. Спасибо за помощь!
Ответ №1:
Physics
и Physics2D
разделены в Единстве и не взаимодействуют друг с другом.
Physics2D.Raycast()
принадлежит к Physics2D и реагирует только на Physics2D (BoxCollider2D, CircleCollider2D, PolygonCollider2D и т. Д.)
Physics.Raycast()
относится к физике и реагирует только на физику (бокс-коллайдер, сферический коллайдер, сетчатый коллайдер и т. Д.)
Вы используете Physics.Raycast()
, когда должны использовать Physics2D.Raycast()
.
Вот как бы вы это сделали:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RaycastControl : MonoBehaviour
{
LineRenderer line;
//private Vector3 zeros;
public LayerMask EnemyLayer;
// Start is called before the first frame update
void Start()
{
line = GetComponent<LineRenderer>();
//zeros = new Vector3(0f, 0f, 0f); not necessary this is the same as Vector3.zero
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Debug.Log("Detected the click");
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
if (hit)
{
Vector3[] linePos = new Vector3[] { transform.position, hit.point};
line.SetPositions(linePos);
Debug.Log("You've hit a Zomboid!");
}
}
}
}```