מטבעות
שיעור 13 מתוך 20 בקורס משחק Unity: נתיבי שמיים של Coddy.
מטבעות נותנים לשחקן סיבה להחליף נתיב כשאין שום דבר בדרך. בכל קטע יש שורה של ארבעה מטבעות בנתיב אחד, אחרי המכשולים שלו, במיקומים 4, 7, 10 ו־13 לאורך הקטע וב־y 1.
המטבע מסתובב בעצמו, באמצעות סקריפט משלו:
void Update()
{
transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime);
}ה־prefab של המטבע מונח על צדו, ולכן ציר ה־z שלו מצביע כלפי מעלה: סיבוב סביב z מסובב אותו כמו מטבע על שולחן.
איסוף המטבעות הוא באחריות ה־Runner, באותו OnTriggerEnter: מטבע מוסיף אחד באמצעות game.AddCoin() ואז מושמד.
אתגר
קל- ב־
Coinהוסף אתpublic float spinSpeed = 180f;ואת הפונקציהUpdateשלמעלה. - ב־
Roadהוסף אתcoinPrefab, ובסוףFillהצב 4 מטבעות בנתיב אקראי במיקומי z של4f + i * 3f. - ב־
GameManagerהוסף אתpublic TMP_Text coinText;, אתpublic int coins;ואתpublic void AddCoin()(הוסף מטבע אחד, ואז קרא ל־ShowScore()). הפונקציהShowScoreגם קובעת אתcoinText.text = "Coins: " + coins;. - ב־
Runner.OnTriggerEnter, בתוךelse if (other.CompareTag("Coin")): הוסף את המטבע והשמד אותו.
נסו בעצמכם
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 float slideTime = 0.7f;
public int lane;
private CharacterController controller;
private GameManager game;
private float fallSpeed;
private float slide;
void Start()
{
controller = GetComponent<CharacterController>();
game = FindFirstObjectByType<GameManager>();
}
void Update()
{
if (!game.over)
{
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);
StopSlide();
}
if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
{
slide = slideTime;
Resize(0.5f);
}
}
if (slide > 0f)
{
slide -= Time.deltaTime;
if (slide <= 0f) StopSlide();
}
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);
}
void StopSlide()
{
if (transform.localScale.y < 1f) Resize(1f);
slide = 0f;
}
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;
}
void OnTriggerEnter(Collider other)
{
if (game.over) return;
if (other.CompareTag("Obstacle"))
{
game.GameOver();
}
}
}
כל השיעורים ביחידה משחק Unity: נתיבי שמיים
תרגלו בעצמכם: Unity אונליין