首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity2D抓取对象脚本

Unity2D抓取对象脚本
EN

Stack Overflow用户
提问于 2021-01-09 12:35:44
回答 2查看 705关注 0票数 0

我正试着让这个抓取脚本和我的游戏一起工作。在游戏中,你像鱼一样在水中玩耍,鱼应该能够抓取和携带物品。

问题:,我明白了,通过光线投射,你可以将光线发射到一定的方向,这在我的游戏中是行不通的。这段代码在其他方面运行良好,但我不知道如何修复代码,以便能够从任何方向抓取对象,只要在范围内即可。

我已经尝试过了:,我尝试过Physics2D.CircleCast,但是在那里,您也必须为演员设置特定的方向(?)同时也尝试了OnTriggerEnter,但也无法让它发挥作用。有没有办法向四面八方(不是z)投射射线?还是有更简单的方法来做这件事?

代码语言:javascript
复制
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;
    }   
}
EN

回答 2

Stack Overflow用户

发布于 2021-01-09 13:26:12

你要找的是Physics2D.OverlapCircle ..。这只会检查对撞机是否位于给定的中心和半径的圆内,而不是将圆圈投射到一个特定的方向。您不应该通过标记进行检查,而是对所有能够被抓取的对象使用专用的。

代码语言:javascript
复制
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

代码语言:javascript
复制
using System.Linq;
...

Collider2D[] hits = Physics2D.OverlapCircleAll(transform.position, distance);
  
Collider2D hit = hits.FirstOrDefault(h => h.CompareTag("grabbale");  

if (hit)
{
    currentlyGrabbedObject = hit.transform;
}     
票数 0
EN

Stack Overflow用户

发布于 2021-01-09 13:36:38

我认为您可以使用OverlapCircle来检查要抓取的项目是否在这样的范围内:

代码语言:javascript
复制
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中,您可以添加如下脚本:

代码语言:javascript
复制
public bool isGrabbed = false;
public Transform holdPoint;

void Update()
{
   if(isGrabbed)
   {
      TrackHoldPoint();
   }
}

private void TrackHoldPoint()
{
   transform.position = holdPoint.position;
}

然后,为了更容易设置,您可以添加这个小脚本,以便在编辑模式下查看圆圈的范围:

代码语言:javascript
复制
private void OnDrawGizmosSelected()
{
    if (transform == null) return;

    Gizmos.DrawWireSphere(transform.position, range);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65642702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档