FantaCode Parkour & Climbing Algorithm

Tài liệu kỹ thuật để giữ lại subsystem climbing trong khi loại bỏ locomotion, camera, input và gameplay framework gốc của FantaCode.

1. Dữ liệu và ownership

Thuật toán cần một Animator Humanoid, root-motion clips, ClimbPoint, ledge/obstacle layer và adapter cho input, physics, grounded state, root motion cùng quyền sở hữu transform.

Chỉ một subsystem được phép ghi root transform, Rigidbody gravity và root motion trong từng action.

2. Activity Diagram: từ mặt đất đến treo
Ground input to hang activity diagram

ClimbToLedge chọn point hợp lệ trước, sau đó ClimbToPoint phân loại wall/free hang và chọn entry hoặc predictive action.

3. Activity Diagram: input khi đang treo
Hanging point selection activity diagram

Input dùng không gian local của nhân vật: x * right + y * up. Candidate được tìm từ collider ledge, rồi lọc theo góc, hướng normal, khoảng cách, space và obstacle.

4. Activity Diagram: Root Motion, MatchTarget và IK
MatchTarget and IK activity diagram

Sampler đọc offset xương đầu/cuối clip. Các offset được chuyển sang basis của point, sau đó MatchTarget khóa một tay tại contact window và IK nội suy tay/chân còn lại.

5. BracedHang và FreeHang
LoạiĐiều kiệnIKAnimator
BracedHangHai SphereCast từ chân hit tường.Tay và chân.freeHang = 0
FreeHangKhông có đủ tường sau chân.Tay là điểm khóa chính; triệt foot IK.freeHang = 1
6. Activity Diagram: ladder là chuỗi point
Ladder as climb points activity diagram

FantaCode không có ladder controller chuyên dụng. Thang là các point dọc theo local up và dùng cùng closestPoint, shimmy, jump, mount và drop như ledge.

7. Kiến trúc tối giản nên giữ
  1. ClimbPoint graph và surface data.
  2. Target selector có debug rõ ràng.
  3. Physics query độc lập.
  4. Animation solver gồm sampler rig-only, MatchTarget và staged IK.
  5. Character adapter để khóa motor chính khi action chạy.
  6. Input adapter chuyển input game thành climbing intent.
8. Giới hạn implementation hiện tại
  • Candidate selector dùng ngưỡng cứng và thứ tự collider có thể ảnh hưởng kết quả gần ngưỡng.
  • Neighbour metadata chưa là nguồn movement mặc định.
  • Offset dùng Vector3.up, không phù hợp gravity biến đổi.
  • Không chạy đồng thời Invector motor và FantaCode locomotion/root motion.
  • Animation sampler phải chỉ có rig và phải tắt animation event.