Đánh bật lùi
Thuộc phần Vật lý và lối chơi trong hành trình Unity của Coddy. Bài học 57 trên 71.
Một cú đánh bật là lực đẩy vật ra xa thứ đã va vào nó: một xung lực dọc theo đường nối từ vật gây va chạm đến vật bị va chạm. Tấm đệm này đánh bật mọi thứ va vào nó:
[SerializeField] private float power = 8f;
void OnCollisionEnter(Collision collision)
{
Vector3 away = collision.transform.position - transform.position;
away.y = 0f;
collision.rigidbody.AddForce(away.normalized * power, ForceMode.Impulse);
}collision.transform.position - transform.position chỉ hướng từ tấm đệm đến vật đã va vào nó. Thành phần y được đặt thành 0 để cú đẩy giữ nguyên phương ngang, còn normalized giúp độ lớn của nó không đổi dù tâm của hai vật cách nhau bao xa. ForceMode.Impulse tạo ra một cú đẩy tức thời: nó thay đổi vận tốc một lượng bằng power chia cho khối lượng, ngay lập tức, nên quả bóng có khối lượng 2 bay đi với tốc độ bằng một nửa quả bóng có khối lượng 1. ForceMode.Force mặc định được thiết kế để áp dụng ở mỗi bước và tạo ra lực bằng một bước, nhỏ hơn 50 lần.
Cú đẩy chỉ kéo dài khi không có gì ghi đè vận tốc. Người chơi có FixedUpdate đặt rb.linearVelocity theo các phím mũi tên ở mỗi bước sẽ mất cú đẩy này ngay ở bước tiếp theo. Vì vậy, một script như vậy phải để yên vận tốc một lúc sau khi bị đánh trúng, hoặc di chuyển người chơi bằng lực.
Thử thách
Trung bìnhCho người chơi tạo ra một làn sóng xung kích bằng phím Space.
- Khi có
Input.GetKeyDown(KeyCode.Space), dùng vòng lặpforeach (Collider hit in Physics.OverlapSphere(transform.position, radius)), bỏ qua collider của chính người chơi. - Với mỗi
hit.TryGetComponent(out Rigidbody body), lấyaway = hit.transform.position - transform.positionvớiaway.y = 0f. - Gọi
body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);.
Nhấn Chơi rồi nhấn Space giữa các thùng hàng. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class Shockwave : MonoBehaviour
{
[SerializeField] private float radius = 4f;
[SerializeField] private float power = 6f;
[SerializeField] private float lift = 2f;
void Update()
{
// Khi nhấn Space: đẩy mọi Rigidbody trong phạm vi radius ra xa người chơi
}
}
Tất cả bài học trong Vật lý và lối chơi
1Rigidbody
Trọng lực và khối lượngĐẩy bằng AddForceNhảy bằng xung lựcFixedUpdate cho vật lýVận tốcVật thể động họcÔn tập: Bệ phóng4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine đầu tiên của bạnVòng lặp trong CoroutineDừng CoroutineÔn tập: đếm ngược10Dự án: Thoát khỏi đấu trường
Đấu trườngThợ săn2Va chạm
OnCollisionEnterMình đã va chạm với gì?Vỡ khi va chạmĐứng trên mặt đấtĐộ nảy và ma sátHình dạng colliderÔn tập: Tường có thể phá vỡ5Dự án: Cuộc đua thu thập xu
Quả bóng lănThu thập xuTự luyện tập: Playground Unity