我正试着让这个抓取脚本和我的游戏一起工作。在游戏中,你像鱼一样在水中玩耍,鱼应该能够抓取和携带物品。
问题:,我明白了,通过光线投射,你可以将光线发射到一定的方向,这在我的游戏中是行不通的。这段代码在其他方面运行良好,但我不知道如何修复代码,以便能够从任何方向抓取对象,只要在范围内即可。
我已经尝试过了:,我尝试过Physics2D.CircleCast,但是在那里,您也必须为演员设置特定的方向(?)同时也尝试了OnTriggerEnter,但也无法让它发挥作用。有没有办法向四面八方(不是z)投射射线?还是有更简单的方法来做这件事?
using UnityEngine;
using System.Collections;
public class grabberscript : MonoBehaviour
{
public bool grabbed;
RaycastHit2D hit;
public float distance = 0f;
public Transform holdpoint;
public LayerMask notgrabbed;
void Update()
{
if (Input.GetButtonDown("Fire3"))
{
if (!grabbed)
{
Physics2D.queriesStartInColliders = false;
hit = Physics2D.Raycast(transform.position, Vector2.right * transform.localScale.x, distance);
if (hit.collider != null && hit.collider.tag == "grabbable")
{
grabbed = true;
}
}
else
{
grabbed = false;
}
}
if (grabbed)
hit.collider.gameObject.transform.position = holdpoint.position;
}
}发布于 2021-01-09 13:26:12
你要找的是Physics2D.OverlapCircle ..。这只会检查对撞机是否位于给定的中心和半径的圆内,而不是将圆圈投射到一个特定的方向。您不应该通过标记进行检查,而是对所有能够被抓取的对象使用专用的。
public class grabberscript : MonoBehaviour
{
public float distance = 0f;
public Transform holdpoint;
// Use the layer(s) for all objects that shall be grab able
public LayerMask grabbable;
private Transform currentlyGrabbedObject;
void Update()
{
if (Input.GetButtonDown("Fire3"))
{
if (!currentlyGrabbedObject)
{
Collider2D hit = Physics2D.OverlapCircle(transform.position, distance, grabbable);
if (hit)
{
currentlyGrabbedObject = hit.transform;
}
}
else // release currently grabbed object
{
currentlyGrabbedObject = null;
}
}
if (currentlyGrabbedObject)
{
currentlyGrabbedObject.position = holdpoint.position;
}
}
}如果您不像前面所说的那样使用一个层,您宁愿使用Physics2D.OverlapCircleAll,并使用匹配您的标记的第一个点击,例如使用Linq FirstOrDefault
using System.Linq;
...
Collider2D[] hits = Physics2D.OverlapCircleAll(transform.position, distance);
Collider2D hit = hits.FirstOrDefault(h => h.CompareTag("grabbale");
if (hit)
{
currentlyGrabbedObject = hit.transform;
} 发布于 2021-01-09 13:36:38
我认为您可以使用OverlapCircle来检查要抓取的项目是否在这样的范围内:
if(!grabbing)
{
//This will save the position of all gameObjects in a specific range which are set in a or multiple specific layers
Collider2D[] grabbedItems = Physics2D.OverlapCircleAll(transform.position, grabRange, grabbableLayer);
}
Foreach(Collider2D item in grabbedItems)
{
if(item.ComapreTag("grabbable"))
{
item.isGrabbed = true;
}
}然后,在您想要实现可抓取的gameObject中,您可以添加如下脚本:
public bool isGrabbed = false;
public Transform holdPoint;
void Update()
{
if(isGrabbed)
{
TrackHoldPoint();
}
}
private void TrackHoldPoint()
{
transform.position = holdPoint.position;
}然后,为了更容易设置,您可以添加这个小脚本,以便在编辑模式下查看圆圈的范围:
private void OnDrawGizmosSelected()
{
if (transform == null) return;
Gizmos.DrawWireSphere(transform.position, range);
}https://stackoverflow.com/questions/65642702
复制相似问题