Tóm lược về component

Kiến thức cơ bản về component trong unity mà bạn cần biết

Giới thiệu

Unity component là các chức năng mà bạn thêm vào GameObject cho một mục đích cụ thể

Component là gì

Component là một chức năng mà bạn thêm vào GameObject. Cụ thể như sau :

1
2
3
4
5
6
Camera : Camera component
Light : Light component
Collider detection : Collider component
Image display : SpriteRenderer
Mesh display : MeshRenderer
Button : Button component

image

Tất cả các chức năng mà chúng ta thường gọi là “camera” và “light” là component Bạn có thể thêm bao nhiêu component tùy thích vào GameObject.

Unity thêm component vào GameObject bằng cách thêm chúng. Bạn có thể tự do tạo chức năng của trò chơi.

Các tính năng của component

Component có thể thêm vào GameObject

Tính năng lớn nhất của component là nó có thể được thêm vào GameObject.

Mặt khác, một component không thể tự làm bất cứ điều gì. Nó chỉ hoạt động khi bạn thêm nó vào GameObject.

Component yêu cầu kế thừa từ class MonoBehaviour để có thể thêm vào GameObject

Các component cũng có thể được tạo bởi chính nhà phát triển. Như điều khiển nhân vật (CharacterControl), logic trò chơi (GameLogic), v.v. Đây gọi là phát triển chức năng trò chơi.

Bạn có thể thêm các component của riêng mình vào GameObject bằng cách kế thừa class MonoBehaviour.

Nhiều component giống nhau có thể được thêm vào GameObject

Bạn có thể thêm nhiều component giống nhau vào GameObject. image

Các component giống nhau độc lập với nhau. Nhìn vào hình ảnh bên dưới, chúng ta có thể thấy rằng Instance ID của chúng là khác nhau image

Các cách cơ bản để sử dụng component

Add component

Điều đầu tiên cần nhớ là cách thêm một component vào GameObject. Thực tế có bốn cách để thêm một thành phần

Thông qua nút Add Component trong cửa sổ Inspector

image

Thêm conponent thông qua menu Component trên menubar

bạn cần chọn GameObject muốn thêm conponent trước image

Kéo thả trực tiếp từ Project vào GameObject

bạn cần chọn GameObject muốn thêm conponent trước image

Lưu ý: bạn cần nhấn giữ mà không chỉ là nhấp vào tệp lệnh component, nếu không cửa sổ Inspector sẽ hiển thị thông tin của tệp lệnh component Bạn cũng có thể sử dụng tính năng khóa Inspector để khóa hiển thị Inspector hiện tại để dễ dàng kéo thả

lock_inspector

Hoặc sử dụng tính năng nhiều Inspector trong Unity 2021+ để mở một Inspector khác cho nội dung được chỉ định và nó tách biệt với Inspector chính. Bạn có thể mở nó bằng cách nhấp chuột phải vào bất kỳ asset hoặc GameObject nào trong dự án của bạn và chọn properties ở cuối menu xuất hiện hoặc bằng cách nhấp chuột trái vào nó và sử dụng phím tắt Alt + P

image

Thông qua script

Các phương pháp được đề cập trước đó đều là thao tác với Editor. Cách tiếp theo sẽ được thao tác bằng script. Bạn có thể sử dụng phương thức AddComponent

1
2
public Component AddComponent(System.Type componentType){..};
public T AddComponent<T>() where T : Component => this.AddComponent(typeof (T)) as T;

Ví dụ: thêm thành phần PlayerMovement vào GameObject

1
2
3
4
5
6
7
8
public class Player : MonoBehaviour
{
    void Start()
    {
        gameObject.AddComponent(typeof(PlayerMovement));
        gameObject.AddComponent<PlayerMovement>();
    }
}

AddComponent chỉ là một chức năng của GameObject để thực thi AddComponent cho GameObject Hãy nhớ điều này vì đó là một phương pháp bạn sử dụng rất nhiều.

Delete component

Có 2 cách để xóa component khỏi GameObject

Xóa compoment trong inspector

image

Sử dụng phương thức Destroy trong script

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/// <summary>
///   <para>Removes a GameObject, component or asset.</para>
/// </summary>
/// <param name="obj">The object to destroy.</param>
/// <param name="t">The optional amount of time to delay before destroying the object.</param>
[ExcludeFromDocs]
public static void Destroy(Object obj)
{
    float t = 0.0f;
    Object.Destroy(obj, t);
}

/// <summary>
///   <para>Removes a GameObject, component or asset.</para>
/// </summary>
/// <param name="obj">The object to destroy.</param>
/// <param name="t">The optional amount of time to delay before destroying the object.</param>
[NativeMethod(IsFreeFunction = true, Name = "Scripting::DestroyObjectFromScripting", ThrowsException = true)]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern void Destroy(Object obj, [DefaultValue("0.0F")] float t);

Đoạn mã mẫu sau đây là một ví dụ về việc thêm mới PlayerMovement và xóa nó sau 1 giây. Quá trình chờ 1 giây sử dụng một hàm có tên là coroutine.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
using System.Collections;
using UnityEngine;

public class Player : MonoBehaviour
{
    private IEnumerator Start()
    {
        var playerMovement = gameObject.AddComponent(typeof(PlayerMovement));
        //or you can use var playerMovement = gameObject.AddComponent<PlayerMovement>();

        yield return new WaitForSeconds(1f);
        Destroy(playerMovement);
    }
}

hoặc có thể viết theo cách khác như sau

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Start()
    {
        var playerMovement = gameObject.AddComponent(typeof(PlayerMovement));
        //or you can use var playerMovement = gameObject.AddComponent<PlayerMovement>();

        Destroy(playerMovement, 1);
    }
}

PlayerMovement đã được thêm và xóa sau 1 giây. Destroy được sử dụng rất nhiều nên hãy nhớ nó

GetComponent

Có ba cách để lấy các component.

Sử dụng GetComponent

Phương thức GetComponent sẽ trả về một component với kiểu chỉ định truyền vào Nó có thể được lấy bằng cách chỉ định tên của component.

Mã nguồn của GetComponent

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[SecuritySafeCritical]
public unsafe T GetComponent<T>()
{
    CastHelper<T> castHelper = new CastHelper<T>();
    this.GetComponentFastPath(typeof (T), new IntPtr((void*) &castHelper.onePointerFurtherThanT));
    return castHelper.t;
}

/// <summary>
///   <para>Returns the component of Type type if the game object has one attached, null if it doesn't.</para>
/// </summary>
/// <param name="type">The type of Component to retrieve.</param>
[TypeInferenceRule(TypeInferenceRules.TypeReferencedByFirstArgument)]
[FreeFunction(HasExplicitThis = true, Name = "GameObjectBindings::GetComponentFromType", ThrowsException = true)]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Component GetComponent(System.Type type);

Hãy xem xét đoạn mã cụ thể sau

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Awake()
    {
        // get the component (PlayerMovenent)
        var playerMovement = GetComponent<PlayerMovement>();
    }
}

Ở đây ta đang nhận được PlayerMovement bằng phương thức GetComponent.

image

Bạn có thể nhận được thành phần PlayerMovement khi PlayerMovement component được gắn vào cùng một GameObject như AddPlayerComponent như hình trên.

Nếu bạn không thể lấy thành phần bằng GetComponent Thì component đó có thể không được đính kèm trước vào GameObject. Trong trường hợp đó, giá trị trả về của GetComponent là null.

Nếu nó là null, bạn có thể muốn đính kèm một component mới vào. Bạn có thể thực hiện điều đó như sau

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Awake()
    {
        // get the component (PlayerMovenent)
        var playerMovement = GetComponent<PlayerMovement>();
        // if it does not exist, attach a new one
        if (playerMovement != null)
        {
            playerMovement = gameObject.AddComponent<PlayerMovement>();
        }
    }
} 

Nếu PlayerMovement không tồn tại, nó sẽ được thêm mới bằng cách sử dụng phương thức AddComponent Đó là một kỹ thuật bạn sẽ sử dụng rất nhiều, vì vậy hãy ghi nhớ nó.

Sử dụng GetComponents để nhận tất cả component của Type trong GameObject

Như đã giải thích ở trong phần tính năng của component là ta có thể thêm cùng một component nhiều lần vào GameObject

image

Để có được tất cả các component giống nhau cùng một lúc hãy sử dụng GetComponents Tương tự như GetComponent, nhưng lưu ý rằng nó có chữ “s” ở cuối.

1
2
3
4
5
6
7
8
9
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Awake()
    {
        PlayerMovement[] playerMovements = GetComponents<PlayerMovement>();
    }
}

Kết quả trả về một mảng, bạn có thể lấy từng component riêng lẻ bằng cách truy vấn mảng được trả về này

Sử dụng GetComponentInChildren

GameObject có thể có một hệ thống phân cấp như trong hình bên dưới.

hierarchy

GetComponent được giới thiệu trước đó chỉ có thể nhận được một cấp độ của component Bạn cũng có thể lấy các component của phân cấp con bằng cách sử dụng GetComponentInChildren, sẽ được giới thiệu bên dưới

Giống như hình ảnh cây phân cấp ở trên, đối tượng Movement nằm ở vị trí cuối cùng

Chúng ta sẽ sử dụng GetComponentInChildren để lấy component PlayerMovement gắn với đối tượng Movement. Với điều kiện class Player được gắn vào đối tượng Player

1
2
3
4
5
6
7
8
9
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Awake()
    {
        PlayerMovement playerMovement = GetComponentInChildren<PlayerMovement>();
    }
} 

- Ghi chú: GetComponentInChildren cũng bao gồm kiểm tra cho chính bản thân nó

Như tên cho thấy, GetComponentInChildren có xu hướng chỉ nhắm mục tiêu đến hệ thống phân cấp con, nhưng trên thực tế, nó cũng sẽ kiểm tra chính bản thân nó

image

Lưu ý rằng phạm vi tìm kiếm cho GetComponentInChildren là một hệ thống phân cấp con bao gồm chính nó, như được hiển thị ở trên.

- Cách loại trừ các thành phần không hoạt động khỏi tìm kiếm

Ta có thể sử dụng GetComponentInChildren để lấy các thành phần của hệ thống phân cấp con. Nhưng trong một số trường hợp, bạn có thể muốn loại trừ các component không hoạt động.

Nói cách khác, nó trông giống như hình bên dưới.

image

Điều này có nghĩa là các component của GameObject deactive sẽ bị loại trừ khỏi tìm kiếm.

Điều này có thể đạt được đơn giản bằng cách gán true cho đối số của GetComponentInChildren.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Awake()
    {
        // Assign true to the argument to exclude inactive components
        PlayerMovement playerMovement = GetComponentInChildren<PlayerMovement>(true);
    }
} 

Khi đó PlayerMovement của GameObject deactive sẽ bị loại trừ khỏi mục tiêu tìm kiếm.

Lưu ý rằng chỉ các GameObject deactive mới bị loại trừ khỏi tìm kiếm, nếu chỉ có component bị deactive thì nó sẽ không bị loại trừ Giống ảnh sau đây component PlayerMovement bị disable nhưng đối tượng GetComponentInChildren vẫn đang active nên kết quả sẽ không loại trừ đi nó

image

- Nhận nhiều component trong hệ thống phân cấp con với GetComponentsInChildren

Giống như GetComponent, GetComponentInChildren cung cấp một cách để nhận được nhiều hơn một component của Type. Đó là GetComponentsInChildren. Giống như GetComponent, nó có thêm chữ “s” ở cuối.

Ví dụ:

1
2
3
4
5
6
7
8
9
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Awake()
    {
        PlayerMovement[] playerMovement = GetComponentsInChildren<PlayerMovement>();
    }
} 
1
2
// Assign true to the argument to exclude inactive components
PlayerMovement[] playerMovement = GetComponentsInChildren<PlayerMovement>(true);

GetComponentsInChildren cũng loại trừ các component không hoạt động khỏi mục tiêu tìm kiếm nếu đối số được đặt thành true.

GetComponentInParent

Bạn có thể tìm kiếm component bên trong các đối tượng cha bằng cách sử dụng GetComponentInParent. Ví dụ:

1
2
3
4
5
6
7
8
9
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    private void Start()
    {
        var player = GetComponentInParent<Player>();
    }
}

Nhận component của cấu trúc phân cấp cha từ chính bạn như ví dụ trong hình bên dưới.

image

GetComponentInParent, giống như bất kỳ phương thức nào khác bạn có thể lấy nhiều thành phần bằng cách sử dụng “GetComponentsInParent”.

Bật tắt component với enable

image image

BẬT / TẮT này có tác động như thế nào?

Nó có ảnh hưởng đến các ’event function’ như Start và Update …

Nếu nó là disable, các ’event function’ này sẽ không được thực thi. Nếu bạn không viết một ’event function’ cụ thể, hộp checkbox sẽ không được hiển thị.

Có tổng cộng 7 event function

  1. Start()
  2. Update()
  3. FixedUpdate()
  4. LateUpdate()
  5. OnGUI()
  6. OnDisable()
  7. OnEnable()

Checkboxe sẽ xuất hiện khi bạn viết các hàm này trong file script. Như đã đề cập ở trên, các hộp checkbox được kiểm soát bởi thuộc tính ’enable'.

Các kỹ thuật khác

Bây giờ bạn đã biết cách sử dụng cơ bản của các component. Dưới đây là 6 kỹ thuật khác để sử dụng.

Chỉ định component sẽ được thêm vào với RequireComponent

Có một số component luôn cần component khác được đính kèm theo để có thể hoạt động, chúng ta có thể thêm nó như mặc định bằng RequireComponent Thật tiện lợi khi sử dụng RequestComponent cho các component mà bạn luôn muốn nó sẽ được kèm theo

Ví dụ, component Image.

image_component

Như bạn có thể thấy trong video ở trên CanvasRenderer được thêm vào cùng lúc với component Image lúc được thêm vào đối tượng.

Bạn có thể đạt được điều này bằng cách sử dụng cú pháp sau

Chỉ cần viết [RequireComponent (typeof (component name))] trong phần định nghĩa class

Ví dụ:

1
2
3
4
5
6
using UnityEngine;

[RequireComponent(typeof(PlayerData))]
public class Player : MonoBehaviour
{
}

require_component

Sau đó, nếu bạn thêm component player vào GameObject như thế này, component PlayerData sẽ được tự động thêm vào

Không thể loại bỏ component được chỉ định bởi RequestComponent

remove_require_component

Nếu bạn muốn loại bỏ component được chỉ định bởi RequiComponent, bạn có thể xử lý nó theo hai cách sau.

  • Xóa RequestComponent bên trong mã
  • Loại bỏ component chứa RequestComponent trước khi loại bỏ component được chỉ định bởi RequireComponent

Bạn nên sử dụng RequestComponent, vì bạn có thể tránh được việc quên đính kèm component. Đây là một kỹ thuật component mà bạn chắc chắn nên nhớ.

Giống như ví dụ trên, trước tiên bạn cần xóa component Player trước khi có thể xóa component PlayerData

Sử dụng DisallowMultipleComponent để cấm thêm các component trùng lặp vào đối tượng

Có những trường hợp bạn không muốn đính kèm cùng một component vào một GameObject nhiều hơn một lần. Điều này có thể đạt được bằng cách sử dụng DisallowMultipleComponent.

1
2
3
4
5
6
using UnityEngine;

[DisallowMultipleComponent]
public class Player : MonoBehaviour
{
}

disable_multiple

DisallowMultipleComponent cũng cấm thêm component từ script

Thoạt nhìn, DisallowMultipleComponent có vẻ là một hạn chế chỉ trên trình soạn thảo Unity, nhưng nó thực sự cũng chặn AddComponent khỏi các tập lệnh. Trong khi chạy Unity, bạn sẽ nhận được thông báo sau về các lần thử AddComponent trùng lặp và không có component nào được thêm vào.

1
2
Can not add 'Player' to Player because a 'Player' is already added to the game object!
UnityEngine.GameObject:AddComponent<Player> ()

Hãy nhớ rằng DisallowMultipleComponent hữu ích khi bạn thực sự muốn chỉ có một component cho một Type.

Add Component Menu

Bạn thực sự có thể thêm các thành phần của riêng mình vào “Component Menu”

Nó rất dễ làm. Chỉ cần thêm một AddComponentMenu trước định nghĩa class như sau

```csharp using UnityEngine;

[AddComponentMenu(“Gamespace/Unit/Player”)] public class Player : MonoBehaviour { }

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

![image](https://user-images.githubusercontent.com/44673303/167307985-f280e35c-8768-44e6-9c8f-92f4021d0307.png)

AddComponentMenu giúp bạn tổ chức và nhóm các component để dễ sử dụng

## TryGetComponent

Bạn đã biết cách sử dụng GetComponent để lấy một component.

Component được chỉ định có thể không tồn tại tại thời điểm bạn cần lấy, phải không?

Vì vậy, bạn có thể sử dụng TryGetComponent. TryGetComponent là một phương thức trả về true nếu nó thành công trong việc lấy component và false nếu nó không thành công.

```csharp
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Start()
    {
        if (TryGetComponent<PlayerMovement>(out var movement))
        {
            // PlayerMovement has been attached and you can get it
        }
        else
        {
            // Couldn't get PlayerMovement (it didn't attached in the first place)
        }
    }
}

Tất nhiên bạn có thể đạt được kết quả tương tự bằng cách null như đã nêu ở ví dụ trước đó. Bạn có thể sử dụng TryGetComponent nó được thêm vào từ Unity 2019.2 nó sẽ không phân bổ GC trong EDITOR nếu đối tượng không có component Bạn có thể chọn cách sử dụng nào đều được điều đó không ảnh hưởng đến performance

Thêm / Xóa component vào nhiều GameObject cùng một lúc

Bạn đã bao giờ muốn thêm một component vào nhiều GameObject cùng một lúc chưa?

Trên thực tế nó là có thể. Đầu tiên bạn chọn tất cả GameObject bạn muốn thêm trong cửa sổ Hierarchy Sau đó, bạn có thể thêm tất cả chúng cùng một lúc và rút ngắn thời gian làm việc.

add_multiple

Điều tương tự cũng áp dụng cho việc xóa. Nếu bạn đang thêm cùng một component. Chỉ cần chọn nhiều GameObject và nhấp vào remove component. Nó không phải là một kỹ thuật bạn sử dụng thường xuyên, nhưng nó là một kỹ thuật hữu ích có thể giúp bạn tiết kiệm thời gian nếu bạn biết nó.

remove_multiple

Tham chiếu component

Hãy xem ví dụ bên dưới

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
using UnityEngine;

public class Player : MonoBehaviour
{
    private PlayerMovement _movement;

    private void Awake()
    {
        _movement = GetComponentInChildren<PlayerMovement>();
    }
}

sẽ được đổi thành

1
2
3
4
5
6
using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField] private PlayerMovement movement;
}

hoặc

1
2
3
4
5
6
using UnityEngine;

public class Player : MonoBehaviour
{
    public PlayerMovement movement;
}

serialized

Bằng cách khai báo một biến tham chiếu, lượng mã được giảm và quá trình xử lý tìm kiếm của GetComponent tại thời điểm chạy cũng được loại bỏ.

Tất nhiên, kỹ thuật này được giới hạn trong các trường hợp mà bạn có thể đặt tham chiếu trước. Nó không thể được sử dụng khi bạn muốn khai báo các component động trong trò chơi.

Để duy trì sự đóng gói của OOP. Vui lòng sử dụng [SerializeField]

Tìm kiếm toàn bộ trong scene với FindObjectOfType

Ngoài phương thức GetComponent, còn có một phương thức được gọi là FindObjectOfType để tìm kiếm toàn bộ cảnh.

Các phương thức được giới thiệu trước đó được giới hạn trong các GameObject tương đối như chính nó, cha và con.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
using UnityEngine;

public class Player : MonoBehaviour
{
    private void Start()
    {
        // Returns the first active loaded object of Type type in scene
        var movement = FindObjectOfType<PlayerMovement>();
    }
}

FindObjectOfType là một phương pháp hữu ích để lấy một component ở đâu đó trong scene.

Sử dụng FindObjectsOfType nếu cảnh có nhiều component

1
PlayerMovement[] movement = FindObjectsOfType<PlayerMovement>();

Bạn có thể nhận tất cả PlayerMovement trong scene dưới dạng một mảng.

Cả FindObjectsOfType và FindObjectsOfType đều có thể loại trừ các component không hoạt động khỏi mục tiêu tìm kiếm. Điều này giống với GetComponentInChildren.

1
PlayerMovement[] movement = FindObjectsOfType<PlayerMovement>(true);

Notes

new Component bị cấm

Bạn đang cố gắng tạo MonoBehaviour bằng từ khóa ’new’. Điều này không được phép. MonoBehaviours chỉ có thể được thêm bằng AddComponent

image

GetComponentInChildren và GetComponentInParent trả về kết quả đầu tiên tìm thấy

GetComponentInChildren tìm kiếm trong hệ thống phân cấp con và GetComponentInParent tìm kiếm trong hệ thống phân cấp cha Cả hai phương thức này đều trả về kết quả đầu tiên mà nó tìm được

Điều quan trọng là thứ tự tìm kiếm. Cả hai đều tìm kiếm từ GameObjects gần đó bắt đầu từ chính nó.

image image

Hãy cẩn thận khi tồn tại nhiều component giống hệt nhau.

Không sử dụng FindObjectOfType nếu có thể

Trong tài liệu Unity

1
2
3
4
5
Object.FindObjectOfType will not return Assets (meshes, textures, prefabs, ...) or inactive objects.
It will not return an object that has HideFlags.DontSave set.

Please note that this function is very slow. It is not recommended to use this function every frame.
In most cases you can use the singleton pattern instead.
1
2
3
4
5
Object.FindObjectOfType sẽ không trả về Assets (mesh, texture, prefabs, ...) hoặc các đối tượng không hoạt động.
Nó sẽ không trả về một đối tượng được đặt cờ là HideFlags.DontSave.

Xin lưu ý rằng chức năng này rất chậm. Không nên sử dụng chức năng này cho mọi khung hình.
Trong hầu hết các trường hợp, bạn có thể sử dụng mẫu singleton để thay thế.

Tốt hơn là không sử dụng FindObjectOfType càng nhiều càng tốt.

Nguyên nhân là do nó tìm kiếm toàn bộ scene. Nếu có nhiều GameObject trong scene, điều này tiêu tốn nhiều sức mạnh của CPU và khiến cho sụt giảm khung hình

Do đó, chúng ta hãy tìm hiểu nơi sử dụng FindObjectOfType. Thời điểm tốt nhất là lúc khởi tạo trò chơi sẽ không có vấn đề gì nếu trò chơi bị chậm đôi chút ở đây

FindObjectOfType rất hữu ích. Tuy thuận tiện nhưng nó cũng tiềm ẩn rủi ro lớn. Như đã giải thích ở trên, điều quan trọng là phải xác định cách sử dụng.

Ngoài FindObjectOfType, việc sử dụng phương thức Find cũng nên cẩn thận về hiệu suất.

Phạm vi truy cập của event function

Phạm vi truy cập của event function có thể là bất cứ thứ gì Phạm vi truy cập là các từ khóa được biết như public, private, internal hay protected mà bạn chỉ định cho class, biến hay phương thức

Chúng chỉ định phạm vi truy cập cho các lớp, phương thức và biến. Thông thường, phạm vi truy cập được đặt dựa trên mục đích sử dụng, nhưng Bỏ qua cho các event function.

Nó sẽ được thực thi cho dù nó là public hay private. Tất cả những gì bạn phải làm là viết một event function. Ngay cả khi component bị vô hiệu hóa (enable có giá trị false), vẫn có thể đặt event function thành một phương thức public và thực thi nó từ bên ngoài.

1
2
3
4
// In case of public method, it can be called from the outside
public void Start ()
{
}

Như hình trên, phương thức Start được đặt là public. Hãy nhớ rằng tắt một component không có nghĩa là nó sẽ không được gọi, nó chỉ không được thực thi tự động theo system của Unity mà thôi

Lượt nghé thăm