Знову всім привіт. Це друга частина статті про рух персонажа в Unity3D. Цей туториал знову буде з прикладом. Тут ми розглянемо рух платформера. Але тепер без анімації. Про неї можете прочитати в попередній статті. і там же описано пересування від третьої особи. тож. Тут все буде трохи простіше, але для стрибка ми тепер не будемо додавати позицію. Тепер ми будемо давати стусана під зад персонажу імпульсом rigidbody імпульс фізичному тілу. Приступимо. (Звичайно созаём скрипт Move. Про створення сцени, де буде все відбуватися, ви так само можете прочитати знову ж в попередньому туторіали)
Для початку прив'яжемо до скрипту обов'язковий компонент. Над класом напишемо "[RequireComponent (typeof (Rigidbody))]".
using UnityEngine;
using System.Collections;
[RequireComponent (typeof (Rigidbody))]
public class Move. MonoBehaviour <
>
Ось. Тепер оголосимо змінні. Гравця, його рігідбоді швидкості, швидкості стрибка, булева змінна (перевіряє стрибок), і саму платформу, з якої при приземленні буде стикатися гравець (в інспектора вкажіть, ага?).
public GameObject Player;
public Rigidbody ThisRigidpody;
public int speed = 5;
public int JumpSpeed = 8;
public bool Jumping;
public GameObject Platform;
У старті присвоюємо змінної гравця і рігідбоді компоненти, на об'єкті яких висить скрипт.
void Start () <
Player = (GameObject) this.gameObject;
ThisRigidpody = (Rigidbody) this.rigidbody;
>
Тепер будемо, для пересування вліво і вправо, додавати позицію. Але тут ще все залежить від того, як ви поставите гравця (у мене гравець - циллиндр). У мене він дивиться вбік, значить, щоб він йшов з боків, потрібно додавати і віднімати по forward'у. Робимо в "void Update ()".
if (Input.GetKey (KeyCode.A) || Input.GetKey (KeyCode.LeftArrow))
<
Player.transform.position + = Player.transform.forward * speed * Time.deltaTime;
>
if (Input.GetKey (KeyCode.D) || Input.GetKey (KeyCode.RightArrow))
<
Player.transform.position - = Player.transform.forward * speed * Time.deltaTime;
>
Отже. У нас все ходить. Тепер зробимо стрибок. Ми просто додамо імпульс рігідбоді гравця. Ось як це робиться: "ThisRigidpody.AddForce (Player.transform.up * JumpSpeed, ForceMode.Impulse);".
Тепер давайте напишемо умова.
if (Input.GetKeyDown (KeyCode.W) || Input.GetKeyDown (KeyCode.UpArrow))
<
if (Jumping == false)
<
Jumping = true;
ThisRigidpody.AddForce (Player.transform.up * JumpSpeed, ForceMode.Impulse);
>
>
Ми перевіряємо, якщо булева змінна "Jumping = false", то тоді можна стрибати. Тобто надається імпульс фізичному тілу.
Тепер давайте доробимо все в перевірці булевої змінної. Створимо новий метод. "Void OnCollisionEnter (Collision collis)".
void OnCollisionEnter (Collision collis)
<
if (collis.gameObject == Platform)
<
Jumping = false;
>
>
У методі ми перевіряємо, якщо колізія, це платформа, то "Jumping = false". І знову можна стрибати.
Ну. Наче все.
using UnityEngine;
using System.Collections;
[RequireComponent (typeof (Rigidbody))]
public class Move. MonoBehaviour <
public GameObject Player;
public Rigidbody ThisRigidpody;
public int speed = 5;
public int JumpSpeed = 8;
public bool Jumping;
public GameObject Platform;
void Start () <
Player = (GameObject) this.gameObject;
ThisRigidpody = (Rigidbody) this.rigidbody;
>
void Update () if (Input.GetKey (KeyCode.A) || Input.GetKey (KeyCode.LeftArrow))
<
Player.transform.position + = Player.transform.forward * speed * Time.deltaTime;
>
if (Input.GetKey (KeyCode.D) || Input.GetKey (KeyCode.RightArrow))
<
Player.transform.position - = Player.transform.forward * speed * Time.deltaTime;
>
if (Input.GetKeyDown (KeyCode.W) || Input.GetKeyDown (KeyCode.UpArrow))
<
if (Jumping == false)
<
Jumping = true;
ThisRigidpody.AddForce (Player.transform.up * JumpSpeed, ForceMode.Impulse);
>
>
>
void OnCollisionEnter (Collision collis)
<
if (collis.gameObject == Platform)
<
Jumping = false;
>
>
>
Можете перевірити, додати анімацію і т.д.
Ось приклад.