Tôi đang bắt đầu triển khai AI của người chơi và kẻ thù trong một trò chơi, nhưng tôi bối rối về cách thực hiện tốt nhất điều này trong kiến trúc trò chơi dựa trên thành phần.
Nói rằng tôi có một nhân vật người chơi sau có thể đứng yên, chạy và vung kiếm. Người chơi có thể chuyển sang trạng thái kiếm vung từ cả trạng thái đứng yên và chạy, nhưng sau đó phải hoàn thành cú swing trước khi người chơi có thể tiếp tục đứng hoặc chạy xung quanh. Trong quá trình swing, người chơi không thể đi bộ xung quanh.
Như tôi thấy, tôi có hai cách tiếp cận thực hiện:
- Tạo một thành phần AI duy nhất chứa tất cả logic người chơi (được tách rời khỏi thành phần thực tế hoặc được nhúng dưới dạng PlayerAIComponent). Tôi có thể dễ dàng thực thi các giới hạn trạng thái mà không cần tạo khớp nối giữa các thành phần riêng lẻ tạo thành thực thể người chơi. Tuy nhiên, thành phần AI không thể bị phá vỡ. Ví dụ, nếu tôi có một kẻ thù chỉ có thể đứng và đi lại hoặc chỉ đi xung quanh và thỉnh thoảng vung kiếm, tôi phải tạo ra các thành phần AI mới.
- Phá vỡ hành vi trong các thành phần, mỗi thành phần xác định một trạng thái cụ thể. Sau đó tôi nhận được một StandComponent, WalkComponent và SwingComponent. Để thực thi các quy tắc chuyển đổi, tôi phải ghép từng thành phần. SwingComponent phải vô hiệu hóa StandComponent và WalkComponent trong suốt thời gian của swing. Khi tôi có một kẻ thù chỉ đứng xung quanh, thỉnh thoảng vung kiếm, tôi phải đảm bảo rằng SwingComponent chỉ vô hiệu hóa WalkComponent nếu nó có mặt. Mặc dù điều này cho phép các thành phần kết hợp và kết hợp tốt hơn, nhưng nó có thể dẫn đến một cơn ác mộng về khả năng bảo trì vì mỗi lần thêm một phụ thuộc, các thành phần hiện có phải được cập nhật để chơi độc đáo với các yêu cầu mới mà phụ thuộc vào nhân vật.
Tình huống lý tưởng là một nhà thiết kế có thể xây dựng kẻ thù / người chơi mới bằng cách kéo các thành phần vào một thùng chứa, mà không phải chạm vào một dòng mã động cơ hoặc mã script. Mặc dù tôi không chắc chắn có thể tránh được mã hóa tập lệnh, nhưng tôi muốn giữ nó đơn giản nhất có thể.
Tóm tắt tất cả: Tôi có nên gộp tất cả logic AI vào một thành phần hoặc chia từng trạng thái logic thành các thành phần riêng biệt để tạo các biến thể thực thể dễ dàng hơn không?
chỉnh sửa : Tôi nghi ngờ có một số nhầm lẫn về những gì tôi có ý nghĩa với tình huống thứ nhất và thứ hai. Tôi đã cố gắng giải thích nó trong sơ đồ dưới đây.
Lưu ý mối quan hệ giữa các quốc gia riêng lẻ và thực thể. Trong tình huống đầu tiên, một thành phần AI được xây dựng trước khi đưa vào thực thể. Một nhà thiết kế chỉ có thể chọn từ một bộ AIComponents riêng biệt được lập trình viên cung cấp. Tình huống thứ hai có các trạng thái khác nhau ở cùng cấp độ với các thành phần khác. Một nhà thiết kế giờ đây có thể tạo ra một thực thể với AI độc đáo mà không cần sự can thiệp của lập trình viên.
Câu hỏi đặt ra là đây có phải là hai lựa chọn duy nhất để cấu trúc AI trong một thực thể dựa trên thành phần và, nếu vậy, điều gì sẽ mang lại sự linh hoạt tối đa?