@SkrinV

Как сделать уничтожение двух объектов по истечению времени на Юнити?

Код по идеи должен запрашивать объекты, которые по прикосновении друг с другом - уничтожаются
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AirUlt : MonoBehaviour
{
public GameObject Ammo;
public GameObject Enemy;
// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{

}
void OnCollisionEnter()
{
if (Trigger("Ammo") == Collision("Enemy"))
{
Destroy(GameObject(Enemy), 7f);
Destroy(GameObject(Ammo), 7f);
}
}
}

Но в итоге мне выдаёт ошибки
Assets\Scripts\AirUlt.cs(22,13): error CS0103: The name 'Trigger' does not exist in the current context
Assets\Scripts\AirUlt.cs(22,32): error CS1955: Non-invocable member 'Collision' cannot be used like a method.
Assets\Scripts\AirUlt.cs(24,21): error CS1955: Non-invocable member 'GameObject' cannot be used like a method.
Assets\Scripts\AirUlt.cs(25,21): error CS0103: The name 'GameObjcet' does not exist in the current context
Как их исправить?
  • Вопрос задан
  • 2290 просмотров
Решения вопроса 1
CHIDWI
@CHIDWI
Unity3D Developer
Если принципиально сделать именно так то нужно понимать что пуля в сцене должна быть только одна иначе этот обьект который "контролирует объекты в воздухе", будет непойми что удалять. Так же для того чтобы столкновение "произошло", на объектах должен быть коллайдер. Я бы посоветовал повесить скрипт непосредственно на пулю или врага и уже в них проверять столкновение, что будет плюсом в плане того, что можно например спавнить пули из префаба с скриптом. Тогда код будет в пуле такой.
void OnCollisionEnter(Collision col){ 
	if (col.gameObject.name=="enemy") {
                Destroy (col.gameObject, 7f); //удаляем врага с !КОТОРЫМ! столкнулись.
	}
  	Destroy (gameObject, 7f); //удаляем нашу пулю если она в что либо врезалась.
}
void Update(){
        Destroy (gameObject, 10f); //удаляем нашу пулю если она никуда не врезалась и улетела в далёкие края.
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
dollar
@dollar
Делай добро и бросай его в воду.
Как исправить проблему

Исправление проблем в плохо работающей программе (игре) называется отладка. Процесс отладки - это поиск, т.е. последовательность проверок и экспериментов, в ходе которой копится информация, которая в итоге помогает догадаться, где и какая ошибка допущена.

Основной метод - это метод исключений. Примерно как в игре "Данетки" (или "Ситуации"), только применительно к приложению ("да" - работает, "нет" - не работает). Очевидно, что нужно правильно подбирать "вопросы", тогда и ответ быстро найдётся. Например, можно попробовать выполнить функцию удаления пули саму по себе без условий. Если она выполнится, то она точно работает, и можно исключить её из дальнейшего анализа. Если она не выполнится, то проблема в ней, и следует углубиться в неё, исключая всё остальное (пока что). Таким образом, одним лишь экспериментом (вопросом) проблема делится пополам, а точнее уменьшается вдвое. И так далее. За 10 таких вопросов-проверок вы уменьшите проблему в 1000 раз, а может уже и полностью локализуете её к тому времени.

Знаю, что ответ слишком общий, но он вам и правда подходит. Как тот ни бесполезно и нравоучительно звучит, но мой совет - учитесь отлаживать.

На данный момент вы задали 0 вопросов, включая этот. Почему ноль? Вопрос-то вы вроде как задали, но результат не описали. Вы сказали, что вам надо (чтобы враг и пуля удалялись), но не сказали, что на данный момент есть. Враг удаляется, а пуля - нет? Пуля удаляется, а враг - нет? Игра вообще не запускается из-за попытки сделать эту фичу? Пуля проходит насквозь? Пуля отскакивает, как от бетона, и падает на пол? Любая из этих подсказок была бы первым шагом и помогла бы уменьшить проблему в 2 или даже в 10 раз. Но вы эту подсказку не дали, так что проблема может заключаться, в чем угодно. В этом случае вам можно помочь либо телепатией (угадыванием), либо сделав вашу задачу с нуля, не беря в расчет ваши наработки.

Но даже если будет 1 подсказка, этого будет не достаточно. Как я сказал выше, нужно несколько подсказок. И где искать следующую, зависит от того, где вы нашли предыдущую. Так что вы и только вы можете этим заниматься. Через Тостер это будет в формате "попробуй так - сделал, вышло то-то - тогда проверь это - ок, выдало такое - значит, здесь исправь" и т.д.

Код в данном случае не очень помогает, и я уже сказал почему. Потому что проблема (которая не описана) может быть, где угодно, даже вне этого кода.

UPD:
Non-invocable member 'GameObject' cannot be used like a method.

Спасибо за добавление описания ошибок в текст вопроса. Теперь гораздо понятнее, что происходит (это аж 4 подсказки), но ответить однозначно всё равно нельзя. Потому что они вроде как очевидны, их описание говорит само за себя, но, тем не менее, вопрос всё ещё актуален. Это говорит о недостатке знаний в C# или в английском языке. Пройдусь кратко:
  1. Trigger вы используете, но нигде не объявили. И компилятор жалуется, что не знает, что это такое. Возможно, вы хотите что-то проверить и вам по смыслу понятно, что это должно быть (какой-то "триггер"), но компилятор не знает английского, для него это лишь идентификатор какой-то сущности - переменной ли, функции ли, и так далее. Кроме того, даже человеческий программист зайдёт здесь в тупик, потому что не ясно, к чему относится ваше Trigger("Ammo"), равно как и Collision("Enemy"). Если у вас в игре много врагов и пуль, то что эта строчка может значить? Коллизию всех со всеми? Или что? Когда (если) вы глубже поймете язык C# и вообще ООП, то узнаете, что есть классы, объекты и их методы. И что методы обычно вызываются не сами по себе, а применительно к какому-то объекту, да хотя бы к текущему (но в текущему такого метода нет). Объяснять "в целом" можно долго, но я не смогу в ответ запихнуть учебник по C#.
  2. Collision - здесь компилятор сообщает, что этот идентификатор ему знаком, но вы его используете не так, как задумано.
  3. GameObject - аналогично предыдущему, это знакомо компилятору, но так нельзя, это не функция.
  4. GameObjcet - а здесь компилятор говорит, как и в первом сообщении, что вы нигде не объявили этот идентификатор. Очевидно, что там просто опечатка. Это как раз тот пример, когда, занимаясь отладкой, вы должны догадаться об этом. Ведь, GameObject это вот прям основное слово в Unity, но компилятор его не знает? Что? Как так? И если исключить невозможное, то остается почти единственный вариант - опечатка. Вот так просто.
Ответ написан
MrMureno
@MrMureno Куратор тега Unity
VR for all
а что не так?
вроде про колизии и тригеры вы в курсе.
как удалять объекты в курсе.
про проверку по тэгу - тоже вроде знаете.

если этот код не копипаста - то описывайте что именно не так работает и на что ругается.

из того что на глаза попалось
if (Enemi.tag == "UltA")
разве так тэг видит?? Enemi - это же коллизия. надо у нее брать геимобджект или коллайдер
Ответ написан
@SkrinV Автор вопроса
Извиняюсь, первые версии этого сообщения - были очень глупыми
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы