Извлеките объекты из списка и телепортируйте их в определенное место в Unity

#c# #unity3d

Вопрос:

и спасибо, что посмотрели на это заранее.

У меня есть еще одна проблема, которую мне нужно решить, и она выглядит так:

У меня есть список объектов, которые я выбираю с помощью радиопередачи, и я хотел бы телепортировать их в определенное место сцены. Например, я выбрал куб и сферу, и они добавляются в мой список под названием playersTagged.

Как я могу переместить объекты в моем списке в это конкретное место, когда OnCollisionEnter с моим плеером имеет тег «Tagger»?

Мой код выглядит так:

Класс с тегами игроков

 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 amp;amp; target.isHit == false)
            {
                target.takeDamage(damage);
                if(hit.collider.tag == "Taggable")
                playersTagged.Add(hit.collider.gameObject);
                target.isHit = true;
            }
        }
    }
}
 

Класс телепортации:

 using UnityEngine;

public class Teleport : MonoBehaviour
{

public Transform teleportTarget;
public PlayerTagged player;

private void OnTriggerEnter(Collider other)
{

    if (other.gameObject.tag == "Tagger")
    {
        Debug.Log("You hit the can");
    }

}

}
 

Ответ №1:

Вам нужно иметь ссылку с тегом игрока в вашем компоненте телепорта. Если оба объекта всегда будут существовать в вашей сцене, создайте только общедоступное поле в вашем телепорте и перетащите ссылку с тегом игрока, в противном случае вам нужно будет заполнить эту ссылку кодом, используя, например, какой-либо подход «найти» GameObject.FindObjectWithTag() .

Вы также можете создать событие, которое срабатывает, когда объект, введенный в OnTriggerEnter, действителен (я имею в виду, когда ваше условие тега проходит), а затем убедитесь, что PlayerTagged зарегистрирован как прослушиватель этого события.

Первый из них проще в настройке, но если вы планируете создавать уникальные вещи с помощью этого OnTriggerEnter, такие как воспроизведение звуков, изменение данных или что-то в этом роде, второй подход лучше.

ПРАВКА: Я попытаюсь вставить какой-нибудь код, дайте мне знать, если у вас все еще возникнут проблемы с получением идеи

«Если оба объекта всегда будут существовать в вашей сцене…»

 using UnityEngine;

public class Teleport : MonoBehaviour
{
    public Transform teleportTarget;
    public PlayerTagged player; // I didn't saw that you already have an ref here, my bad, so you only need to access the fields

    private void OnTriggerEnter(Collider other)
    {

        if (other.gameObject.tag == "Tagger")
        {
            Debug.Log("You hit the can");
            
            var list = player.playersTagged; // this is how you will access your list

            // Do some stuff with your list
        }

    }

}
 

Не обращайте внимания на остальное, это только все усложнит

ПРАВКА 2: Выполнение телепортации в игроке и телепортирование каждого объекта

     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();
        }
    }
    
    // Option 1:
    private void OnTriggerEnter(Collider col)
    {
        if (col.gameObject.tag == "Teleport Tag")
        {
            var teleport = col.gameObject.GetComponent<Teleport>();
            
            TeleportObjectsTo(teleport.teleportTarget.position);
        }
    }

    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 amp;amp; target.isHit == false)
            {
                target.takeDamage(damage);
                if(hit.collider.tag == "Taggable")
                playersTagged.Add(hit.collider.gameObject);
                target.isHit = true;
            }
        }
    }
    
    public void TeleportObjectsTo(Vector3 targetPosition)
    {
        foreach(taggedObjects in playersTagged)
        {
            taggedObjects.transform.position = targetPosition;
        }
    }
}
 

Вы также можете осуществить телепортацию по сценарию телепорта:

 using UnityEngine;

public class Teleport : MonoBehaviour
{
    public Transform teleportTarget;
    public PlayerTagged player; // I didn't saw that you already have an ref here, my bad, so you only need to access the fields

    private void OnTriggerEnter(Collider other)
    {

        if (other.gameObject.tag == "Tagger")
        {
            Debug.Log("You hit the can");
            
            // Option 2:
            player.TeleportObjectsTo(teleportTarget);

            // Option 3: Or you can iterate here instead of make use of the API
            foreach(var taggedObjects in player.playersTagged)
            {
               taggedObjects.transform.position = targetPosition;
            }
        }

    }
}
 

Выберите один вариант и удалите/прокомментируйте другие

—Н

Комментарии:

1. Я не уверен, что совсем понимаю?

2. А теперь взгляни еще раз

3. Я люблю тебя. Теперь я точно знаю, что ты имеешь в виду !!! Большое вам спасибо !!!

4. Нефисто. Мне жаль, но я думал, что все понял. Но, похоже, я этого не делаю. Я пытался с момента вашего ответа, но не получил желаемого результата. Не могли бы вы, пожалуйста, помочь мне немного подробнее с тем, как я могу телепортировать объекты в списке, когда игрок вводит триггер.

5. Вы хотели телепортировать все объекты в списке в какое-то место?