我如何添加光线投射统一命中的对象并将它们添加到列表中

Posted

技术标签:

【中文标题】我如何添加光线投射统一命中的对象并将它们添加到列表中【英文标题】:How do i add the objects that the raycast is hitting in unity and add them to a list 【发布时间】:2021-11-27 18:30:06 【问题描述】:

我有这个问题,我只是不知道如何解决。 我正在尝试在 Unity 中制作游戏,但偶然发现了这样的问题。

当我用光线投射击中它时,我想将场景中的一个对象放在一个列表中。

到目前为止,我已经尝试过。当我在其中一个对象上按下鼠标按钮时,它将所有标记为相同事物的所有内容都放在列表中,或者它只放入相同的事物(本例中为立方体)。

我的代码是:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerTagged : MonoBehaviour

public float damage = 10f;
public float range = 100f;

public Camera fpsCam;

public List<GameObject> playersTagged;

private void Update()

    if (Input.GetButtonDown("Fire1"))
    
        Shoot();
    


void Shoot()

    RaycastHit hit;

    if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
    
        Debug.Log(hit.transform.name);
        Target target = hit.transform.GetComponent<Target>();

        if (target != null)
        
            target.takeDamage(damage);
            if(hit.collider.tag == "Taggable")
            playersTagged.Add(GameObject.FindWithTag("Taggable"));
        
    


【问题讨论】:

【参考方案1】:

使用

playersTagged.Add(hit.collider.gameObject);

【讨论】:

【参考方案2】:

而不是使用返回第一个对象的 GameObject.FindWithTag() 它将找到source

使用游戏对象属性 playerTagged.Add(target.gameobject)。由于所有组件都存储了对它们所附加的游戏对象的引用。

【讨论】:

【参考方案3】:

您正在添加GameObject.FindWithTag("Taggable"),这意味着您正在获取任何具有该标签的游戏​​对象并将其添加到列表中。但是相反,您想添加命中对象,因此您需要添加hit.collider.gameObject

【讨论】:

you are getting all GameObjects .. 不,只有第一个;)你不能在不使用AddRange的情况下将Add多个元素添加到一个列表中;) 你是对的@derHugo。已编辑!

以上是关于我如何添加光线投射统一命中的对象并将它们添加到列表中的主要内容,如果未能解决你的问题,请参考以下文章

使用光线投射的对象拾取

使用光线投射时如何重新着色所有模型的零件?

如何将视觉添加到 JComponent

使用光线投射和实例化对象问题检查与多边形碰撞器的碰撞(统一)

Three.js 从鼠标位置投射光线

创建 N 个对象并将它们添加到列表中