Nam châm
Bài học 14 trên 21 trong khóa học Trò chơi Unity: đường đua trên trời của Coddy.
Các vật phẩm tăng sức mạnh khiến mỗi lượt chơi có cảm giác khác với lượt trước. Vật phẩm đầu tiên là nam châm: trong 8 giây, mọi đồng xu gần nhân vật chạy sẽ bay về phía nhân vật.
Runner lưu thời gian còn lại trong magnet và đếm ngược. Mỗi đồng xu hướng về phía nhân vật chạy, và khi nam châm đang hoạt động, đồng thời nhân vật ở gần, đồng xu sẽ di chuyển về phía nhân vật:
if (runner.magnet > 0f && Vector3.Distance(transform.position, runner.transform.position) < pullRange)
{
transform.position = Vector3.MoveTowards(transform.position, runner.transform.position, pullSpeed * Time.deltaTime);
}Đồng xu bay vào nhân vật chạy, rồi vùng kích hoạt của nó sẽ xử lý phần còn lại. Thỉnh thoảng, một đoạn đường sẽ có vật phẩm nam châm màu hồng, cách chướng ngại vật 6 đơn vị.
Thử thách
DễNam châm hút những đồng xu ở gần về phía người chạy.
Runner: thêmmagnetTime = 8fvàmagnet; giảm dần giá trị magnet khi nó lớn hơn 0.- Thẻ
Magnetđặtmagnet = magnetTimevà hủy vật phẩm nhặt được. Coin: thêmpullRange = 7fvàpullSpeed = 30f, rồi hút xu như trên.Road.Fill: vớifloat roll = Random.value;, đặtmagnetPrefabở một làn ngẫu nhiên tại y 1, z -6 khiroll < 0.06f.
Nhấn Chơi và nhặt nam châm màu hồng: xu sẽ bay về phía bạn. Sau đó nhấn Kiểm tra.
Tự làm thử
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();
}
else if (other.CompareTag("Coin"))
{
game.AddCoin();
Destroy(other.gameObject);
}
}
}
Tất cả bài học trong Trò chơi Unity: đường đua trên trời
Tự luyện tập: Playground Unity