2016-03-05 2 views
0

Я борется с тем, как заставить мяч изменить удар, исходя из того, где он попадает на весло. Обычно в игре в понг меняется угол, в зависимости от того, насколько далеко от центра отскакивает мяч, и в каком направлении центр отскакивает. мне удалось сделать что-то вроде этого:Unity Change Ball Direction после удара весла в понг игре (как в dx-ball)

//rb = rigidbody, velOnPaddleHit = predefined float 
float dist = transform.position.x - paddle.position.x; 
dist = transform.position.x > paddle.position.x ? dist : -dist; 
dist /= paddle.localScale.x/2; 
dist *= velOnPaddleHit; 
rb.addForce(dist, 0,0); 

Но это просто не работает/это странно. Может ли кто-нибудь мне помочь?

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

https://www.youtube.com/watch?v=fHX_2DLDp1w

+0

AddForce() взять вектор в качестве параметра, почему addForce() с параметром типа float? – attolee

+0

oops, извините, у меня есть вектор3 в коде, он должен быть rb.addForce (dist, 0,0); –

ответ

0

Вы do't изменить его на основе, где он ударил веслом. Чтобы изменить направление мяча, все, что вам нужно сделать, это перевернуть цифры в противоположном направлении. Таким образом, умножение значения x и y на жесткое тело на -1 и применение его к шару должно сделать именно это.

если шар сталкивается с веслом, умножьте скорость шара Rigidbody по всей оси на -1, для оси г или оси х, за исключением (в зависимости от того, как вы настроите вашу сцены. Это может эфир г или х оси, но оси уMUST умножить на -1 в другом, чтобы идти в другом направлении.

Вы можете иметь speedVariable, что увеличивает скорость мяча каждый раз, когда он попадет в весло.

void OnCollisionEnter(Collision collision) 
{ 

    if (collision.gameObject.name == "ball") 
    { 
     Vector3 tempVect = new Vector3(collision.rigidbody.velocity.x * -1, collision.rigidbody.velocity.y * -1, collision.rigidbody.velocity.z); 
     collision.rigidbody.velocity = tempVect; 
    } 
} 

Чтобы определить, куда попал мяч, самый простой способ, о котором я знаю, это использовать крошечные коллайдеры.

  1. Создать по-крайней мере 24 коллайдеров коробки. Назовите их detector1 к detector24 (detector1, detector2, detector3, detector4, detector5 .....)

    МаркisTrigger из 24 box colliders true так, чтобы они не сталкивались с мячом.

  2. Создатьслой называется «detectorLayer» и убедитесь, что эти 24 коробки коллайдера находятся в слое «detectorLayer».

  3. Создать другой слой под названием "ballLayer" и сделать уверен, чтослой шара является установить в "ballLayer".

  4. Приложитьколлайдер к веслом называется. Изменить Ваше имя Игрового объекта вашего paddle на "Paddle". Создать новый слой называется "PaddleLayer" и убедитесь, что "Paddle" GameObject находится в слое под названием "PaddleLayer".

  5. Позиция эти 24 коллайдеров из оставили в праве в порядке близко к веслу, но убедитесь, что они не прикасаясь веслом или коллайдер весла. Ниже приведенное изображение поможет вам понять, что я делаю.

enter image description here

Написание кода должен быть кусок кусок пирога.

bool firstColision = false; 
  1. Проверить Если мяч сталкивается с Paddle с OnCollisionEnter. firstColision = true;

  2. Сразупроверки какие из 24- коллайдеров мяча трогательных с функцией OnTriggerEnter. Внутри функции OnTriggerEnter, убедитесь, что firstColision является верно перед тем проверки, какой из 24 box colliders трогает мяч.

    Первый коробчатый коллайдер под названием «детектор1» расположен на самой левой стороне, в то время как последний коллайдер коробки, называемый «детектором24», расположен с правой стороны пакера. Вы можете использовать оператор if if или оператор switch todetect, который вызывает коллайдер шарика. 24/2 = 12 так коробка коллайдер под названием «detector24» должен быть расположен в средней и следует считать средней весла.

  3. (ДЕЙСТВИЕ) После обнаружения которых поле номера мяч попал из с OnTriggerEnter, теперь вы можете делать все, что вы хотите. Например, заберите мяч слева или . Вы можете иметь постоянные значения, которые диктует как далеко движение мяч для каждого ящика коллайдераобнаружен. Это зависит от вас. Теперь вы делаете свои собственные правила.

  4. НаборfirstColision к false, чтобы сбросить его.

    ПРИМЕЧАНИЕ: Это не обязательно должно быть 24 полевых коллайдера. Это может быть , но чем больше у вас есть, тем лучше.

Если все работает, как и ожидалось, вы можете сделать заключительную часть, которая должна перейти к Edit ->Настройки проекта ->физики и убедитесь, что верно следующее:

A. detectorLayer не может столкнуться с detectorLayer.

B. PaddleLayer не может столкнуться с detectorLayer.

Это улучшит производительность мобильных устройств.

+0

Нет, это не то, что я спросил. Я знаю, как отскакивать мяч, но я хочу изменить направление в зависимости от того, где мяч попадает в весло. Введите dx-ball на Youtube, и вы увидите –

+0

Я просто смотрел видео, и теперь я понимаю. Раньше этого вида игры не видел. Я уточню свой ответ, но это может занять много времени. – Programmer

+0

ОК, спасибо мат. Мне нравится эта игра, потому что простая игра с отскоком в мяч очень скучна - вы не можете контролировать мяч, только весло. –

Смежные вопросы