gpt4 book ai didi

unity3d - 使用 Raycast2D 检测对象

转载 作者:行者123 更新时间:2023-12-01 09:55:09 26 4
gpt4 key购买 nike

我正在研究简单的策略游戏机制。我有一个军营预制件。当我在场景中添加兵营并单击兵营时,我收到 NullReferenceException错误:

NullReferenceException: Object reference not set to an instance of an object PlacementController.Update () (at Assets/Scripts/PlacementController.cs:64)



当我尝试使用 Raycast2D 到达兵营的对撞机名称时收到错误。

Barracks prefab 有一个 Box Collider2D collider(触发器被选中),它的标签是“Building”,它的层是“Buildings”。它有一个rigidbody2D组件,它是一个运动学刚体。

我想不通这个问题。请帮我。

谢谢你的时间。
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
}
}
}

}

------------------ 我正在分享答案,感谢您的帮助 --------------------
 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);

}

最佳答案

Unity 有两个非常相似的物理引擎,但这是它们以微妙和令人困惑的方式不同的一个领域。

3D引擎提供 Physics.Raycast ,返回 true命中,或 false否则,并允许您传递 RaycastHit如果您需要了解更多有关热门歌曲的信息,请引用。

2D 引擎提供 Physics2D.Raycast ,而是返回 RaycastHit2D命中,或 null除此以外。您的代码编写方式,hit您访问的命中与 raycast 调用返回的命中不同。

所以,你需要更接近这个的东西:

RaycastHit2D hit = Physics2D.Raycast(...); //edit in your raycast settings
if (hit) {
//do something with the hit data
}

(您可能会注意到 RaycastHit2D 隐式转换为 bool 。)

Unity 有很长一段时间只有 3D 引擎,所以很多旧文档会说好像只有 3D 引擎一样。请注意这一点。

关于unity3d - 使用 Raycast2D 检测对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29737296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com