Controlling Game Object using Components
Unity2D
4
White

tinywitch viết ngày 25/10/2016

Trong Unity Editor, ta có thể tạo ra các thay đổi cho các thuộc tính của Component bằng cách sử dụng Inspector. Chẳng hạn thay đổi giá trị của Transform Component sẽ dẫn đến kết quả là sự thay đổi vị trí của Game Object. Hầu hết script đều là để chỉnh sửa các thuộc tính của Component để điểu khiển Game Object. 1 script có thể thay đổi các giá trị của thuộc tính theo từng thời điểm hay theo sự phản hồi từ input của người dùng. Bằng sự thay đổi, ta có thể tạo ra hay hủy 1 object trong 1 thời điểm thích hợp và bất cứ thành phần nào của gameplay cũng ảnh hưởng theo sự thay đổi này.

Accessing Components

Trường hợp đơn giản nhất là kết nối đến Component khác trong cùng 1 Game Object. Ta có cú pháp như sau:

void Start()
{
    RigidBody rb = GetComponent();
    rb.mass = 10f;
}

Theo cách này ta có thể set các param cho RigidBody Component giống như việc set giá trị trực tiếp trong Inspector Panel. Nếu ta tham chiếu đến 1 Component không có trong object thì biến mà ta khai báo hoặc get giá trị sẽ trả về null.
Vì có một số Component mà hay được sử dụng nên Unity có build sẵn một số đối tượng để ta dùng trực tiếp trong Editor mà không cần phải khai báo. Ví dụ:

void Start()
{
    transform.position = Vector3.zero;
}

Tất cả những built-in Component này được liệt kê trong Mono Behaviour Script Reference Page.

Accessing Other Objects

Mặc dù các object hoạt động độc lập với nhau, nhưng thường thì chúng vẫn có sự liên quan với nhau. Ví dụ enemy cần được biết vị trí của player. Unity cung cấp một số phương pháp để gọi được các Game Object khác, trong những tình huống nhất định.

Linking Objects with Variables

Cách đơn giản nhất là add game object khác như là 1 biến trong game object đang chứa đoạn script:
public class Enemy : MonoBehaviour

{
    public GameObject player;
}

Ta có thể kéo thả từ scene hoặc Hierarchy Panel vào Inspector Panel để gán giá trị cho biến public GameOject đó. Hàm GetComponent và biến Component cũng có thể được dùng như bình thường trong trường hợp này, như ví dụ sau đây:

public class Enemy : MonoBehaviour
{
    public GameObject player;
    void Start()
    {
        transform.position = player.transform.position - Vector3.forward * 10f;
    }
}

Ngoài ra, nếu ta khai báo 1 biến public kiểu Component thì ta có thể kéo thả bất kỳ 1 game object nào mà có component đó vào Inspector của game object ta đang xét. Script khi này có thể liên kết trực tiếp đến Component của Object ta tham chiếu đến.

{
    public Transform playerTransform;
}

Việc nối các Object lại với nhau bằng các biến rất hữu dụng với những object riêng biệt có liên kết với nhau. Ta có thể dùng mảng để nối các object cùng loại đó.

Finding Child Objects

Thỉnh thoảng, 1 game scene sẽ có 1 lượng các object cùng loại, chẳng hạn enemy hoặc chướng ngại vật. Chúng cần được theo dõi bởi 1 đoạn script đặc biệt có thể quản lý được chúng. Ví dụ, tất cả các waypoint cần được cung cấp cho đoạn script tìm đường. Tuy nhiên điều này sẽ làm cho quá trình thiết kế trở nên khó khăn nếu có thêm 1 waypoint mới được thêm vào như 1 biến mới trong đoạn script. Tương tự vậy, nếu có 1 waypoint được xóa bỏ thì sẽ khó khăn khi phải bỏ cả các tham chiếu đến biến bị xóa đó. Trong trường hợp này, ta thường quản lý 1 tập các object bằng việc biến các object đó thành con của 1 object cha nào đó. Các object con có thể được gọi bằng cách sử dụng Transform Component của object cha (Bởi vì tất cả các game object đều có Transform Component)

public class WaypointManager : MonoBehaviour
{
    public Transform waypoints;
    void Start()
    {
        waypoints = new Transform[transform.childCount];
        int i = 0;
        for (Transform t in transform)
        {
            waypoints[i++] = t;
        }
    }
}

Ta có thể lấy 1 object con đặc biệt bằng cách sử dùng function Transform.Find

{
    transform.Find("Gun");
}

Điều này rất có ích khi có 1 object con được thêm bớt trong suốt gameplay. 1 vũ khí được nhặt lên hay vất xuống là 1 ví dụ điển hình cho trường hợp này.

Finding Objects by Name or Tag

Ta luôn có thể lấy được 1 object ở bất cứ nơi nào trong Scene Hierarchy miễn là ta có 1 số thông tin để phân biệt chúng. Những object có thể được gọi bằng tên, sử dụng GameObject.Find function:

GameObject player;
void Start()
{
    player = GameObject.Find("hero");
}

Một object hay 1 tập các object có thể được gọi ra bởi tag của chúng, sử dụng GameObject.FindWithTag hoặc GameObject.FindObjectWithTag function:

GameObject player;
GameObject[] enemies;
void Start()
{
    player = GameObject.FindWithTag("Player");
    enemies = GameObject.FindGameObjectsWithTag("Enemy");
}

Tham khảo

Unity Documentation

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

tinywitch

4 bài viết.
7 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
8 5
Khi ta gọi một hàm, nó sẽ chạy đến khi hoàn thành hết các câu lệnh rồi mới return. Điều này có nghĩa là bất kì 1 hành động nào được đặt trong hàm s...
tinywitch viết 3 năm trước
8 5
White
4 1
Một script trong Unity không giống như ý tưởng viết một chương trình truyền thống, nghĩa là các đoạn code vẫn tiếp tục được chạy cho đến khi hết vò...
tinywitch viết 3 năm trước
4 1
Bài viết liên quan
White
0 0
Một số game có một lượng cố định các object trong scene. Nhưng thường có những nhân vật, vật phẩm và những object khác được tạo ra hoặc hủy trong g...
tinywitch viết 3 năm trước
0 0
White
4 1
Một script trong Unity không giống như ý tưởng viết một chương trình truyền thống, nghĩa là các đoạn code vẫn tiếp tục được chạy cho đến khi hết vò...
tinywitch viết 3 năm trước
4 1
White
8 5
Khi ta gọi một hàm, nó sẽ chạy đến khi hoàn thành hết các câu lệnh rồi mới return. Điều này có nghĩa là bất kì 1 hành động nào được đặt trong hàm s...
tinywitch viết 3 năm trước
8 5
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
4 bài viết.
7 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á!