#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. Вы хотели телепортировать все объекты в списке в какое-то место?