Я новичок в 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);
}
}
Я копирую классическую зигзагообразную игру, но создаю платформы и в других направлениях. так что это пока похоже на оригинальную игру.
@IgnacioAlorre говорит, что первые 30 платформ создаются в направлении -x. поэтому персонаж перемещается на -x при нажатии. а с 31 по 60 платформы появляются в направлении X. Итак, 31-я платформа - это когда персонаж должен быть уведомлен о переключении.





Поскольку вы создаете несколько платформ впереди, возможно, в 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 .. Я буду реализовывать и сообщу вам, помогло ли это. Спасибо друг!! ваше здоровье
Большое спасибо @ KYL3R за объяснение с диаграммой. Теперь действительно имеет смысл. Реализуем его сегодня вечером. Буду держать вас в курсе, если это сработает. Спасибо за помощь и продолжайте в том же духе. Ура, приятель !!!
После этого объяснения с изображением я мог бы продолжить и реализовать -X и X, а также -Z и Z. Придал мне уверенности, в которой я нуждался. :)
Думаю, это все равно сыграло бы хорошо. Для пользователя это по-прежнему «управление в одно касание» - очень просто! Только «тумблер» другой. Но будьте осторожны с этим случайным генерированием платформ, избегайте шаблонов 2x2 или размещения платформ НА существующих платформах. Вы также можете использовать checkBox во время генерации - чтобы убедиться, что место свободно
Да, я тоже это учел. (используя это также при создании платформ). Спасибо :)
мне удалось добиться изменения направления из вашего кода. Спасибо за помощь. Подскажите, как мне избежать создания платформы 2x2. Он всегда генерирует 2x2, когда я переключаю направление при нересте платформы.
Я бы посчитал порожденные Z и X (плюс) платформы. Но этот мог по-прежнему создает нежелательные формы. Код checkBox может проверять наличие коллизий на существующих платформах и избегать нежелательного соседства.
возникает проблема, заключающаяся в том, что я не могу сказать своему персонажу, когда происходит переключение направления.
Вам просто нужно сослаться на 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 ну на самом деле я пытался объяснить ему, как сообщить игроку из сценария создания, что он должен изменить направление. Мне нужно будет спросить его, когда именно должно произойти переключение, чтобы адаптировать код. Должен признаться, я никогда не играл в эту игру.
Это, вероятно, по-прежнему вызовет проблему, как указано в KYL3R. Платформа нереста намного опережает бегущего персонажа. Так что я не могу просто использовать счет в качестве индекса для переключения направлений. (Оценка была моим первоначальным предположением, но позже я понял, насколько это была ужасно плохая идея. Я только что опубликовал свой исходный код).
Если вы гуглите изображения, кажется, что вы идете по пути случайных плиток X / Z и просто переключаете направление ходьбы. Простой переключатель больше не работает, если у вас также есть платформы -X. Здесь в игру вступает вопрос ОП.
@ignacio allore говорит, что первые 30 платформ создаются в направлении -x. поэтому персонаж перемещается на -x при нажатии. а с 31 по 60 платформы появляются в направлении X. Итак, 31-я платформа - это когда персонаж должен быть уведомлен о переключении.
@IgnacioAlorre: ваш ответ действительно решает некоторые из моих проблем. Спасибо друг!!
@UdaykiranBitla Я предполагал, что у вас это уже работает, и ваша проблема заключалась в том, что вы не могли сообщить игроку, когда менять направление. Поэтому я ответил на то, что вы задали в вопросе, а не на то, как реализовать другую часть.
Используете ли вы эту функцию для переключения направлений SwitchDirection ()? и после каких строк кода нереста вы хотели бы выполнить этот переключатель? Я дал вам ответ о том, как вызывать метод из одного скрипта в другой, но чтобы он работал правильно, мне нужно точно знать, когда и где вы реализуете этот переключатель направления.