Unity: движение 3D-модели в зависимости от появления платформы

Я новичок в Unity и начал создавать простую зигзагообразную игру. Платформы изначально появляются в направлениях X и Z, и игрок меняет направление при нажатии на экран в направлениях X и Z.

После, скажем, порождения 30 платформ, я переключаю порождение платформы на оси -X и Z. Как мне сообщить моей 3D-модели, что теперь при нажатии на экран она должна изменить направление по осям -X и Z.

Я написал код, но возникает проблема, заключающаяся в том, что я не могу сказать своему персонажу, когда происходит переключение направления. Так случилось, что платформы все еще появляются по осям X и Z, но мой персонаж теперь движется по осям -X и Z.

Как мне синхронизировать появление платформы и направление персонажей?

КОД

Вот код для создания платформы

 void SpawnPlatform() {

 if (score  < 30)
 {
  int rand = Random.Range(0, 6);
  if (rand < 3)
  {
     SpawnX();
  }
  else if (rand >= 3)
  {
     SpawnZ();
  }
 }
if (score > 30)
{
  int rand = Random.Range(0, 6);
  if (rand < 3)
  {
     SpawnNegX();
  }
  else if (rand >= 3)
  {
     SpawnZ();
  }
}

void SpawnX()
{
  Vector3 pos = lastPos;
  pos.x += size;
  lastPos = pos;
  Instantiate(platform, pos, Quaternion.identity);

  int rand = Random.Range(0, 4);
  if (rand < 1)
  {
      Instantiate(diamonds, new Vector3(pos.x,pos.y+1,pos.z), 
      diamonds.transform.rotation);
  }
}

 void SpawnNegX()
 {
 Vector3 pos = lastPos;
 pos.x -= size;
 lastPos = pos;
 Instantiate(platform, pos, Quaternion.identity);

 int rand = Random.Range(0, 4);
 if (rand < 1)
 {
     Instantiate(diamonds, new Vector3(pos.x,pos.y+1,pos.z), 
     diamonds.transform.rotation);
 }

 }

 void SpawnZ()
 {
 Vector3 pos = lastPos;
 pos.z += size;
 lastPos = pos;
 Instantiate(platform, pos, Quaternion.identity);

 int rand = Random.Range(0, 4);
 if (rand < 1)
 {
     Instantiate(diamonds, new Vector3(pos.x, pos.y + 1, pos.z), 
     diamonds.transform.rotation);
 }
}

и это для контроллера персонажа. Проблема здесь. как мне сообщить персонажу, что теперь меняют направление между -X и Z вместо X и Z.

 void Update () {
 if (!started)
 {
     if (Input.GetMouseButtonDown(0))
     {
         rb.velocity = new Vector3(speed, 0, 0);
     }
 }

 if (!Physics.Raycast(transform.position, Vector3.down, 1f))
 {
     rb.velocity = new Vector3(0, -25f, 0);
 }

 if (Input.GetMouseButtonDown(0) && !gameOver)
 {
     SwitchDirection();
 }
}

 void SwitchDirection()
 {
 if (rb.velocity.z > 0)
 {
     rb.velocity = new Vector3(speed, 0, 0);
 }else if (rb.velocity.x > 0)
 {
     rb.velocity = new Vector3(0, 0, speed);
 }
}

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

введите описание изображения здесь

Используете ли вы эту функцию для переключения направлений SwitchDirection ()? и после каких строк кода нереста вы хотели бы выполнить этот переключатель? Я дал вам ответ о том, как вызывать метод из одного скрипта в другой, но чтобы он работал правильно, мне нужно точно знать, когда и где вы реализуете этот переключатель направления.

Ignacio Alorre 30.05.2018 09:35

@IgnacioAlorre говорит, что первые 30 платформ создаются в направлении -x. поэтому персонаж перемещается на -x при нажатии. а с 31 по 60 платформы появляются в направлении X. Итак, 31-я платформа - это когда персонаж должен быть уведомлен о переключении.

Udaykiran Bitla 30.05.2018 09:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
232
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку вы создаете несколько платформ впереди, возможно, в Z+, X- или X+, вы не можете просто создать bool для переворота X после создания первой платформы -X.

Вам нужно знать, где будет следующая платформа. Или лучше, есть платформа в X+ или нет.

Мой подход использует Физика. для проверки (Raycast тоже подойдет), платформам нужен boxcollider, чтобы это работало.

Код:

void SwitchDirection()
{
   if (rb.velocity.z > 0)
   {
       bool platformInXplus = Physics.CheckBox(transform.position + Vector3.right * size, Vector3.one * .1f + Vector3.up * 2f, Quaternion.identity, /*layermask*/ 0, QueryTriggerInteraction.UseGlobal); 

       if (platformInXplus)
       {
           rb.velocity = new Vector3(speed, 0, 0);
       }
       else
       {
           rb.velocity = new Vector3(-speed, 0, 0);
       }
   }
   else if (Mathf.Abs(rb.velocity.x) > 0f)
   {
       rb.velocity = new Vector3(0, 0, speed);
   }
}

Если в вашей игре больше коллайдеров, вы можете поместить платформы на слой и использовать правильный маска слоя в CheckBox. (Например, чтобы не проверять свои бриллианты)

edit: Я изменил rb.velocity.x > 0, потому что это больше не верно во всех случаях. Я использую абсолютный сейчас, чтобы проверить, движемся ли мы в X+ ИЛИ X-.

edit2: Я изменил размер CheckBox на Vector3.one * .1f + Vector3.up * 2f

edit3: Если вы стоите очень далеко слева на платформе, checkBox может поразить текущую платформу. Возможно, вы захотите сначала округлить позицию игрока, чтобы привязаться к сетке платформы (так что вы начинаете с центра на текущей платформе, а затем проверяете единицы size справа)

так что это (.1, 2.1, .1), чтобы убедиться, что вы попадаете на платформу, даже если исходная точка плеера находится выше нее.

Спасибо @ KYL3R .. Я буду реализовывать и сообщу вам, помогло ли это. Спасибо друг!! ваше здоровье

Udaykiran Bitla 30.05.2018 09:41

Большое спасибо @ KYL3R за объяснение с диаграммой. Теперь действительно имеет смысл. Реализуем его сегодня вечером. Буду держать вас в курсе, если это сработает. Спасибо за помощь и продолжайте в том же духе. Ура, приятель !!!

Udaykiran Bitla 30.05.2018 15:10

После этого объяснения с изображением я мог бы продолжить и реализовать -X и X, а также -Z и Z. Придал мне уверенности, в которой я нуждался. :)

Udaykiran Bitla 30.05.2018 15:12

Думаю, это все равно сыграло бы хорошо. Для пользователя это по-прежнему «управление в одно касание» - очень просто! Только «тумблер» другой. Но будьте осторожны с этим случайным генерированием платформ, избегайте шаблонов 2x2 или размещения платформ НА существующих платформах. Вы также можете использовать checkBox во время генерации - чтобы убедиться, что место свободно

KYL3R 30.05.2018 15:22

Да, я тоже это учел. (используя это также при создании платформ). Спасибо :)

Udaykiran Bitla 30.05.2018 15:24

мне удалось добиться изменения направления из вашего кода. Спасибо за помощь. Подскажите, как мне избежать создания платформы 2x2. Он всегда генерирует 2x2, когда я переключаю направление при нересте платформы.

Udaykiran Bitla 02.06.2018 09:30

Я бы посчитал порожденные Z и X (плюс) платформы. Но этот мог по-прежнему создает нежелательные формы. Код checkBox может проверять наличие коллизий на существующих платформах и избегать нежелательного соседства.

KYL3R 05.06.2018 08:28

возникает проблема, заключающаяся в том, что я не могу сказать своему персонажу, когда происходит переключение направления.

Вам просто нужно сослаться на player-script из spawing-script платформы и сообщить ему, что направление изменилось.

У вас уже есть функция, созданная в проигрывателе: SwitchDirection(), поэтому вы можете добавить ее в скрипт Spawing.

В инспекторе вам нужно будет связать игрока со скриптом Spawing (в инспекторе перетащите GameObject Player поверх поля переменной mPlayer в скрипте Spawing)

public GameObject mPlayer;
PlayerScript mPlayerScript;

Start(){
    mPlayerScript = mPlayer.GetComponent<PlayerScript>();
}

Обновление на основе вашего комментария: скажем, первые 30 платформ создаются в направлении -x. поэтому персонаж перемещается на -x при нажатии. а с 31 по 60 платформы появляются в направлении X. Итак, 31-я платформа - это когда персонаж должен быть уведомлен о переключении Позже, когда вы увеличиваете счет, вы делаете это:

if (score%30 == 0)
{
    mPlayerScript.SwitchDirection()
}

Никогда не играл зигзагообразно, но я предполагаю, что вы создаете несколько платформ впереди. Итак, вы находитесь на платформе 5, и вы алеради породили еще 5. Ваш код изменится после создания первой отрицательной платформы X, но вы все еще находитесь на расстоянии 5 платформ от нее.

KYL3R 30.05.2018 09:30

@ KYL3R ну на самом деле я пытался объяснить ему, как сообщить игроку из сценария создания, что он должен изменить направление. Мне нужно будет спросить его, когда именно должно произойти переключение, чтобы адаптировать код. Должен признаться, я никогда не играл в эту игру.

Ignacio Alorre 30.05.2018 09:33

Это, вероятно, по-прежнему вызовет проблему, как указано в KYL3R. Платформа нереста намного опережает бегущего персонажа. Так что я не могу просто использовать счет в качестве индекса для переключения направлений. (Оценка была моим первоначальным предположением, но позже я понял, насколько это была ужасно плохая идея. Я только что опубликовал свой исходный код).

Udaykiran Bitla 30.05.2018 09:36

Если вы гуглите изображения, кажется, что вы идете по пути случайных плиток X / Z и просто переключаете направление ходьбы. Простой переключатель больше не работает, если у вас также есть платформы -X. Здесь в игру вступает вопрос ОП.

KYL3R 30.05.2018 09:37

@ignacio allore говорит, что первые 30 платформ создаются в направлении -x. поэтому персонаж перемещается на -x при нажатии. а с 31 по 60 платформы появляются в направлении X. Итак, 31-я платформа - это когда персонаж должен быть уведомлен о переключении.

Udaykiran Bitla 30.05.2018 09:38

@IgnacioAlorre: ваш ответ действительно решает некоторые из моих проблем. Спасибо друг!!

Udaykiran Bitla 30.05.2018 09:39

@UdaykiranBitla Я предполагал, что у вас это уже работает, и ваша проблема заключалась в том, что вы не могли сообщить игроку, когда менять направление. Поэтому я ответил на то, что вы задали в вопросе, а не на то, как реализовать другую часть.

Ignacio Alorre 30.05.2018 09:57

Другие вопросы по теме