Người chơi đang nằm trong vùng nhìn (gần) của NPC

Một phần của tài liệu Thiết kế mô hình tri giác và nhận thức cho các npcs trong stealth game (Trang 86 - 88)

Nếu nhân vật đang ở vùng nhìn gần, ta sẽ thực hiện raycast từ vị trí của NPC đến vị trí ngực của nhân vật với độ dài của ray là clearViewDistance. Trong Unity, raycast là việc bắn một tia từ vị trí bất kỳ, hướng bất kỳ và độ dài bất kỳ để xét xem trên đường đi của tia có va chạm với đối tượng nào không. Khi raycast đến ngực nhân vật, nếu ray đó chạm nhân vật thì xem như NPC đã nhìn thấy và phát hiện nhân vật. Nếu ray hit một vật chắn có chiều cao thấp hơn NPC thì tiếp tục xét xem nhân vật có đang ngồi (crouch) hay không. Nếu nhân vật đang ngồi thì NPC không phát hiện nhân vật, nếu ngược lại thì NPC phát hiện nhân vật. Nếu ray chạm một vật cản có chiều cao cao hơn NPC thì xem như không phát hiện nhân vật.

Nếu nhân vật đang ở vùng nhìn xa, ta sẽ thực hiện raycast từ vị trí của NPC đến vị trí ngực của nhân vật với độ dài của ray là viewDistance. Khi raycast đến ngực nhân vật, nếu ray đó chạm nhân vật hoặc một vật chắn có chiều cao thấp hơn NPC thì tiếp tục xét xem nhân vật có đang ngồi hay không. Nếu nhân vật đang ngồi thì NPC không phát hiện nhân vật, nếu ngược lại thì NPC phát hiện nhân vật. Nếu ray chạm một vật cản có chiều cao cao hơn NPC thì xem như không phát hiện nhân vật.

• Nhìn và phát hiện Bait Bag của Doc McCoy và xác chết: mỗi NPC sẽ có một SphereCollider, trong Unity SphereCollider là component có thể được gắn vào bất kỳ đối tượng nào, để phát hiện sự va chạm với các đối tượng khác. SphereCollider tạo ra một hình cầu xung quanh NPC với bán kính bằng với viewDistance và khi SphereCollider này va chạm với Bait Bag hoặc xác chết, ta sẽ tiến hành xét tiếp các điều kiện khác. Việc sử dụng SphereCollider giúp giảm thiểu sự ảnh hưởng đến hiệu suất của game, thay vì chúng ta phải gọi hàm ở mỗi khung hình để xét xem khoảng cách từ Bait Bag hay xác chết đến NPC có bé hơn viewDistance của NPC không, thì việc dùng SphereCollider sẽ loại bỏ việc gọi hàm ở mỗi khung hình và bây giờ chỉ cần xét SphereCollider có va chạm với các đối tượng hay không và việc này sẽ được hệ thống vật lý bên dưới của Unity đảm nhận, từ đó đảm bảo được hiệu suất của game. Khi SphereCollider va chạm với Bait Bag hay xác chết, ta sẽ xét xem các đối tượng này có được các NPC nào khác phát hiện hay chưa bằng cách xét một biến boolean, tránh trường hợp NPC phát hiện một đối tượng nhiều lần và liên tục đưa ra hành động để xử lý. Nếu các đối tượng đó chưa được NPC nào phát hiện, thì ta sẽ xét tiếp xem các vật này có đang nằm trong vùng nhìn gần không. Nếu có thì ta sẽ raycast đến chúng và nếu ray này chạm chúng thì xem như NPC đã phát hiện và sẽ thay đổi trạng thái của các đối tượng này thành "đã bị phát hiện" vì thế các đối tượng đó sẽ bị bỏ qua trong các lần xem xét tiếp theo.

• Phát hiện nhân vật sau lưng bằng giác quan thứ sáu: giác quan thứ sáu cũng được mô phỏng bằng SphereC- ollider trên. Khi SphereCollider va chạm với nhân vật, thì ta sẽ xét xem khoảng cách từ nhân vật đến NPC có bé hơn khoảng cách mà giác quan thứ sáu của NPC cảm nhận được không. Nếu bé hơn, ta sẽ tiến hành đếm ngược một khoảng thời gian đặt trước và nếu đếm ngược về 0 thì xem như NPC cảm nhận được nhân vật đang ở sau lưng mình.

FieldOfView

FieldOfView giúp vẽ các vùng nhìn của NPC, từ đó người chơi biết được NPC các vùng nhìn và từ đó tránh được việc bị NPC phát hiện. Việc này giúp giao tiếp rõ ràng các thông tin của NPC hay game đến người chơi, loại bỏ các trường hợp người chơi bị NPC phát hiện mà không rõ lí do, gây cảm giác trò chơi không công bằng.

FieldOfView vẽ các vùng nhìn bằng việc thực hiện hàng loạt các raycast từ vị trí của NPC, theo các hướng khác nhau và với độ dài bằng với viewDistance. Lấy các điểm cuối của ray trong trường hợp ray không va chạm vật nào và lấy các điểm va chạm nếu ray va chạm với vật khác, từ các điểm này chúng ta có thể vẽ ra một mesh tạo bởi nhiều tam giác và tạo nên vùng nhìn của NPC. Để vẽ một mesh trong Unity, chúng ta đầu tiên tạo ra một mesh rỗng, sau đó gán các đỉnh vào mảng mesh.vertices và thứ tự của các đỉnh này sao cho cứ 3 đỉnh là tạo thành một tam giác vào mảng mesh.triangles (cùng tập đỉnh nhưng thứ tự của các đỉnh này trong mesh.triangles khác nhau sẽ cho ra các mesh có hình dạng khác nhau). Mesh này sẽ được cập nhật từng khung hình do NPC có thể di chuyển. Việc vẽ vùng nhìn từ các raycast có thể được mô tả như hình dưới:

Một phần của tài liệu Thiết kế mô hình tri giác và nhận thức cho các npcs trong stealth game (Trang 86 - 88)

Tải bản đầy đủ (PDF)

(125 trang)