Unity3D: Trail Renderer для неподвижного объекта
В моей игре мой игрок (мяч) не двигается по оси X. Мяч просто может прыгать (ось Y).
Уровень всегда перемещается по оси X и дает игроку ощущение, что мяч движется.
У меня вопрос: можно ли добавить рендер (или что-то в этом роде) к моему мячу? Чтобы усилить ощущение движения мяча?
Как изображение..: http://www.barouch.fr/bouncyball.png
Спасибо!
1 ответ
Да, вы можете, и я доказал, что это возможно.
Как вы можете видеть на картинке, я вложил 5 сфер рекурсивно, каждая с Z + 1 своего родителя.
Вам понадобится rigidbody
для каждого из них, потому что мы собираемся AddForce
им.
И вот важная часть, сценарии.
У меня есть 3 сценария, названные HeadScript
, BodyScript
, TailScript
(вроде как игра со змеями, поэтому я их так называю)
HeadScript:
void Update () {
if(Input.GetKeyDown(KeyCode.Space)){
rigidbody.AddForce(new Vector3(0, 6, 0), ForceMode.Impulse);
GameObject child = transform.FindChild("Sphere").gameObject;
BodyScript childScript = child.GetComponent<BodyScript>();
childScript.ChildJump();
}
}
HeadScript прикрепляется только к голове (самая правая сфера), он должен обнаружить нажатие клавиши (для прыжка), затем мы добавляем силу к себе (только вверх), чтобы она выглядела как прыжок. Затем возьмите дочерний объект (шарик слева) и вызовите функцию ChildJump
который внутри BodyScript
,
BodyScript:
public void ChildJump(){
Invoke ("Jump", 0.1f);
}
void Jump(){
rigidbody.AddForce(new Vector3(0, 6, 0), ForceMode.Impulse);
GameObject child = transform.FindChild("Sphere").gameObject;
if(child.GetComponent<BodyScript>() == null){
TailScript childScript = child.GetComponent<TailScript>();
childScript.ChildJump();
}
else {
BodyScript childScript = child.GetComponent<BodyScript>();
childScript.ChildJump();
}
}
BodyScript прикрепляется к каждой сфере, кроме первой и последней. Родительские объекты вызывают функцию ChildJump
которая содержит только 1 функцию, Invoke
,
Invoke
используется для вызова функции после определенной задержки. В этом коде задержка составляет 0,1 с.
Jump
сама назовет своего ребенка (мяч слева) ChildJump
функция. Теперь вы понимаете, почему это немного рекурсивно.
Мы добавили условие if, чтобы не получать никаких ошибок при получении BodyScript
компонент из последней сферы, которой там нет. Последний скрипт имеет только TailScript
,
TailScript:
public void ChildJump(){
Invoke ("Jump", 0.1f);
}
void Jump(){
rigidbody.AddForce(new Vector3(0, 6, 0), ForceMode.Impulse);
}
Финальный сценарий, TailScript
только содержит AddForce
к себе, потому что у него нет ребенка.
Каждая сфера (кроме головы) будет прыгать с задержкой 0,1 с от своего родителя, становясь, как вы это называете, рендером следа.
Теперь осталось только добавить альфа-материал для каждого из них, чтобы они стали более прозрачными и вуаля! Работа сделана!