Tìm hiểu về Steering Behaviors (Phần 4) - Cohesion và Separation
Unity
7
AI
8
White

Kaopiz Software Co., Ltd. viết ngày 30/11/2018

Chào mừng mọi người trở lại với series tìm hiểu về steering behaviors. Sau một khoảng thời gian khá dài không viết lách, lần này em sẽ mang đến cho mọi người 2 hành vi vô cùng đơn giản mà cũng mang tính thực tế rất là nhiều. Cohesion (Xích lại gần nhau) và Separation (Tránh xa mị ra).

Separation

Khi một con AI cảm thấy rất là khó ở với các AI xung quanh (Do chúng hôi nách hay vì một lí do đặc biệt nào đó). Thì con AI đó sẽ tìm cách tránh xa tất cả những con AI làm nó thấy khó chịu. Tuy nhiên tìm một nơi tránh xa ra cũng rất là khó khi mà phải tìm đến một nơi nào đó mà không bị mùi hôi nách ảnh hưởng. Do suy nghĩ đến tâm tư tình cảm cũng những con AI như thế Speration được tạo ra để cho AI có khả năng suy nghĩ và tìm cách tránh xa những kẻ gây khó chịu cho chúng.
Đầu tiên chúng ta cần phải thông báo cho AI biết là có bao nhiêu những kẻ gây khó chịu xung quanh nó vì dù sao thì nó cần phải tránh xa tất cả mọi người mà :v.
Một mảng GameObject gọi là all_Unit sẽ được tạo ra dùng để lưu tất cả các game object trong màn hình
Chúng ta có thể tạo all_Unit là một biến public và kéo thả các GameObject được coi như là kẻ khó chịu ở editor GameObject là một Serializable Type trong Unity. Nhưng vì em là một người lười biến nên em sẽ để việc này cho một đoạn Script nhỏ sau:
Start(){
all_Unit = GameObject.FindGameObjectsWithTag("Enemy");
}

Đoạn Script này sẽ được chạy mỗi khi game hay màn hình được khởi động (Do để ở hàm start) thế là khỏe re không cần phải bấm chuột kéo thả các Object nữa.
Và như thế là đã có một mảng các GameObject với tag được đặt là Enemy để cho AI nhỏ bé của chúng ta biết được đâu là kẻ cần phải tránh xa.
Separation là một hành vi tương tự như với Flee. Tuy nhiên cái chúng ta cần là tránh xa mọi đối tượng trong một tầm phạm vi.
Em tạm gọi phạm vi này la sepration_radius
Chúng ta sẽ tìm mọi đối tượng AI mà khoảng cách của nó tới AI được chọn nhỏ hơn phạm vi này và tính toán đường đi nước bước để tránh xa khỏi các đối tượng đó.
Lý thuyết là dư lày:

alt text

Vector2 separation(){
Vector2 steering = Vector2.zero;
int unitCount = 0;
for (int i = 0; i < all_Unit.Length; i++)
{
GameObject unit = all_Unit[i];
if(unit != null)
{
if (unit != this && distance(unit.transform.position, transform.position) < separation_radius)
{
steering.x += unit.transform.position.x - transform.position.x;
steering.y += unit.transform.position.y - transform.position.y;
unitCount++;
}
}
}
if (unitCount != 0)
{
steering.x /= unitCount;
steering.y /= unitCount;
steering = steering * -1;
}
steering = steering.normalized * max_separation;
return steering;
}

Hàm Separation được xây dựng như trên.
Bằng việc tăng steering force lên dựa trên vị trí tương đối giữa đối tượng tránh xa và người được chọn. Tuy nhiên vì chúng ta cần tránh xa tất cả các đối tượng nên khi đã tính được lực cần thiết ta cần phải chia cho số lượng đối tượng để bằng AI được chọn có thể cố gắng tránh xa đối tượng gần nó nhất. Và tương tự như các hành vi khác max_separation chính là hệ số ưu tiên cho separation hoạt động khi đi cùng với những hành vi khác (Nếu có).
Tại đây em sẽ sử dụng hàm FixedUpdate chứ không phải Update như cũ nữa để tránh tình trạng chậm do chạy nhiều lần hàm For Loop trong một update frame.
Kết quả là dư lày:

alt text
Chất lượng gif hơi tệ mong mọi người thông cảm.alt text

Có thể thấy rõ là AI màu đỏ đã tìm được đường để tự cách li mình khỏi thế giới khá là tuyệt phải không :D

Cohesion

Ngược lại với thanh niên tự kỉ sử dụng Separation, những thành viên của hội Cohesion là những thành phần mang tính bầy đàn chơi hội động. Các thành phần kiểu này luôn tìm cách xích lại gần nhau hơn.
alt text
Ở trong đoạn Script của Separtion có thêm một dòng là steering = steering * -1 do các cộng dồn lực là lấy hiệu vị trí của mục tiêu tránh là mục tiêu của bản thân. Cho nên để đỡ phải copy code từ IDE sang em sẽ sử dụng luôn phần code ở trên và bỏ đi dòng đảo ngược Vector và chúng ta đã có Cohesion :D.
Vector2 cohesion(){
Vector2 steering = Vector2.zero;
int unitCount = 0;
for (int i = 0; i < all_Unit.Length; i++)
{
GameObject unit = all_Unit[i];
if(unit != null)
{
if (unit != this && distance(unit.transform.position, transform.position) < cohesion_radius)
{
steering.x += unit.transform.position.x - transform.position.x;
steering.y += unit.transform.position.y - transform.position.y;
unitCount++;
}
}
}
if (unitCount != 0)
{
steering.x /= unitCount;
steering.y /= unitCount;
}
steering = steering.normalized * max_cohesion;
return steering;
}

Bằng việc kiểm tra tất cả các đối tượng trong mảng đối tượng và tìm vị trí trung tâm của chúng AI sử dụng hành vi này sẽ tìm được cách đi tới nơi mà mọi người tập chung đông nhất trong phạm vi của nó.
Và đây là kết quả :
alt text
Nhìn có vẻ không giống lắm nhưng nếu như tất cả các đối tượng đều sử dụng cohesion sẽ có một thứ khá là hay ho mọi người làm thử xem để có thể quan sát kết quả :D


Bài viết này được trích dẫn từ blog nội bộ công ty KAOPIZ - カオピーズ
Bài gốc: http://kipalog.kaopiz.com/posts/6y057cVt4OK3jmPncOnSGA

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Kaopiz Software Co., Ltd.

27 bài viết.
25 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
51 2
Bài viết này được trích dẫn từ blog nội bộ công ty (Link) (Link) Bài gốc: https://kipalog.kaopiz.com/posts/RegexHocroimanhuchuahoc (Ảnh) 1. Tự...
Kaopiz Software Co., Ltd. viết hơn 1 năm trước
51 2
White
7 0
Mở Đầu Chắc hẳn là dev ai cũng từng nghe qua về Docker và Virtual Machine (VBox hoặc Vmware). Docker giúp cho việc xây dựng và triển khai một môi ...
Kaopiz Software Co., Ltd. viết hơn 1 năm trước
7 0
White
6 0
Introduction Elasticsearch là một công cụ tìm kiếm dựa trên nền tảng Apache Lucene. Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công ...
Kaopiz Software Co., Ltd. viết hơn 1 năm trước
6 0
Bài viết liên quan
White
0 0
Recap Ở phần trước em đã giới thiệu cho mọi người sơ qua về Steering Behaviors bao gồm khái niệm, phân loại cũng như viết về 2 loại Behaviors phổ b...
Kaopiz Software Co., Ltd. viết gần 2 năm trước
0 0
White
1 0
Tiếp nối series tìm hiểu về Steering Behaviors, lần này sẽ là một behavior giúp ích rất nhiều cho những những behavior đã giới thiệu. Đó là tránh đ...
Kaopiz Software Co., Ltd. viết hơn 1 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
27 bài viết.
25 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!