החלקה
שיעור 4 מתוך 20 בקורס משחק Unity: נתיבי שמיים של Coddy.
חלק מהמכשולים תלויים גבוה מדי מכדי לקפוץ מעליהם: הרץ מחליק תחתיהם. בזמן ההחלקה הרץ נעשה נמוך בחצי לרגע.
הקטנת האובייקט מקטינה גם את ה־CharacterController שלו, אך הוא מתכווץ סביב האמצע, ולכן כפות הרגליים היו מרחפות חצי יחידה מעל הכביש. הזז את הרץ למטה באותה חצי יחידה. יש להשבית בקר בזמן שמזיזים אותו ידנית, אחרת פעולת Move הבאה שלו תבטל את השינוי:
void Resize(float height)
{
controller.enabled = false;
transform.position += Vector3.up * (height - transform.localScale.y);
transform.localScale = new Vector3(1f, height, 1f);
controller.enabled = true;
}טיימר בשם slide סופר לאחור את משך ההחלקה. כשהזמן שלו אוזל, הרץ קם שוב באמצעות StopSlide:
void StopSlide()
{
if (transform.localScale.y < 1f) Resize(1f);
slide = 0f;
}אתגר
קל- הוסיפו
public float slideTime = 0.7f;ו-private float slide;. - הוסיפו את
ResizeואתStopSlideכפי שמוצג למעלה. - כשלוחצים על S או על החץ למטה כשהדמות על הקרקע, הגדירו
slide = slideTimeוקראו ל-Resize(0.5f). - בכל פריים, אם
slide > 0f, הפחיתו ממנו אתTime.deltaTime, וקראו ל-StopSlide()כשהוא מגיע ל-0. - קפיצה מסיימת החלקה: קראו ל-
StopSlide()כשהרץ קופץ.
נסו בעצמכם
using UnityEngine;
public class Runner : MonoBehaviour
{
public float laneWidth = 2.5f;
public float laneSpeed = 16f;
public float jumpHeight = 1.6f;
public float gravity = -40f;
public int lane;
private CharacterController controller;
private float fallSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
if (jump && controller.isGrounded)
{
fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
fallSpeed += gravity * Time.deltaTime;
float targetX = lane * laneWidth;
float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
controller.Move(move);
}
}
כל השיעורים ביחידה משחק Unity: נתיבי שמיים
תרגלו בעצמכם: Unity אונליין