Thanh đỡ rộng hơn
Bài học 16 trên 19 trong khóa học Trò chơi Unity: phá gạch của Coddy.
Một hiệu ứng có thời hạn là một coroutine: thay đổi, chờ, rồi đổi lại. Nếu bắt được lần thứ hai khi lần đầu vẫn đang chạy, thời gian phải bắt đầu lại, vì vậy hãy giữ lại Coroutine mà StartCoroutine trả về và dừng nó trước khi bắt đầu một coroutine mới. Nếu không, coroutine đầu tiên sẽ kết thúc sớm và hoàn tác hiệu ứng thứ hai. Tăng tốc:
if (boost != null) StopCoroutine(boost);
boost = StartCoroutine(BoostFor(3f));
IEnumerator BoostFor(float seconds)
{
speed = normalSpeed * 2f;
yield return new WaitForSeconds(seconds);
speed = normalSpeed;
boost = null;
}Lệnh này đặt tốc độ dựa trên normalSpeed đã được lưu lại, thay vì nhân đôi tốc độ hiện tại: hai lần tăng tốc liên tiếp sẽ khiến tốc độ nhanh gấp 4 lần. Phần giới hạn vị trí của thanh đỡ đọc chiều rộng của thanh ở mỗi bước, vì vậy thanh đỡ rộng vẫn dừng ở tường.
Thử thách
KhóVật phẩm tăng sức mạnh Wide làm thanh đỡ bóng rộng hơn trong 8 giây.
- Trong
Paddle, thêmpublic float wideFactor = 1.6f;vàpublic float wideSeconds = 8f;, đồng thời lưu tỷ lệ x bình thường trong Awake. - Widen() dừng coroutine đang chạy nếu có, rồi bắt đầu một coroutine: tỷ lệ x bằng tỷ lệ bình thường nhân với
wideFactor, chờwideSeconds, rồi trở về bình thường. - Coroutine cần có
using System.Collections;.
Nhấn Chơi và đón một vật phẩm màu xanh lá: thanh đỡ bóng sẽ rộng ra rồi thu nhỏ lại. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // Mặt trong của hai bức tường bên nằm tại -wallX và wallX
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float input = 0f;
if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;
Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
float halfWidth = transform.localScale.x / 2f;
target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
rb.MovePosition(target);
}
public void Widen()
{
Debug.Log("Wide paddle");
}
}
Tất cả bài học trong Trò chơi Unity: phá gạch
4Vật phẩm tăng sức mạnh
Vật phẩm rơi xuốngTự luyện tập: Playground Unity