본문 바로가기
PROGRAMING📚/Unity📑

[유니티 Unity]다른 스크립트 함수,변수 가져오는 방법

Ta이니 2023. 5. 11.
728x90
반응형

다른 스크립트 함수,변수 가져오는 방법


 

1. 사용하길 원하는 함수와 변수 앞에 Static 을 사용하여 어디서든 접근이 가능하도록 만드는 방법

 

OthersScript.sc 와 SampleScript.sc를 만들어서 변수명 앞에 static을 붙여줘서 전역변수로 만들어 주면

SampleScript.sc안에서도 사용할 수 있게 된다.

 

2. Find(string findObject) 함수를 사용하여 해당하는 이름을 가진 오브젝트의 컴포넌트에 접근해서 불러오는 방법

 

OthersScript가 들어가있는 오브젝트의 이름을 찾아서 오브젝트안에 있는 스크립트 함수를 가져오는 방법이다.

GameObject.Find("스크립트를 가지고 있는 오브젝트의 이름")GetComponent<가지고올 스크립트명>();

 

이방법으로 찾는것도 가능하나 Find를 쓰면 Hierarchy 안에있는 모든 오브젝트들에서 Others라는 이름을 찾기 때문에

가벼운 프로젝트에서는 괜찮으나 많은 오브젝트들이 있는 경우 성능이 떨어지기 때문에 Find()는 거의 사용하지 않는게 좋다.

 

 

 

3. 싱글톤 패턴(디자인 패턴)을 사용해 하나의 객체를 생성해서 사용하여 접근하는 방법

 

싱글톤 패턴의 방법은 2가지가 있다. 나같은 경우는 첫번째 방법을 주로 사용하는 편인거 같다.

첫번째는 싱글톤 클래스가 Monobehaviour를 상속받아서 Hierarchy에 존재하는 방법

 public static OthersScript instance { get; private set; }
    
    public int other_int;

    private void Awake()
    {
        if (instance != null)
            Destroy(this);
        else instance = this;
    }

 

OthersScript 클래스를 담아주는 static 변수(instance)를 선언해준다.

이미 OtherScript.instance가 이미 존재하는 경우,

현재 새로 생성된 OthersScript.instance는 삭제하고 기존에 있는 것을 사용 한다. 

 

[클래스 싱클톤 패턴 만들기]

[함수 호출 방법]

 

클래스이름.instance.함수();

 

 

두번째는 싱글톤 클래스를 만들어 Monobehaviour 상속받지 않고 Hierarchy에도 존재 하지 않게 하는 방법이 있다.

 

 

 

MonoBehaviour를 상속하는 방법과 유사하지만 Class의 경우에는 게임에 인스턴스가 없으면 하나 생성해서 넣어줘야한다. 그리고 반드시 생성자를 하나 생성해주어야 값이 NULL이 안되고 정상적으로 출력된다.

 

 

[소스코드]

더보기
public class OthersClass
{
    public static OthersClass instance;
    public int otherClass_int_num1;
    public int otherClass_int_num2;
    public static OthersClass Instance 
    {
        get
        {
            if (instance == null)
            {
                instance = new OthersClass();
            }
            return instance;
        }
    }
    //생성자를 만들어 주어야함
    public OthersClass()
    {

    }
}
public class SampleScript : MonoBehaviour
{

    private void Start()
    {

        OthersScript.instance.other_int = 12;
        OthersClass.Instance.otherClass_int_num1 = 20;
        OthersClass.Instance.otherClass_int_num2 = 23;

        Debug.Log("other_int : " + OthersScript.instance.other_int);
        Debug.Log("otherClass_int1 : " + OthersClass.Instance.otherClass_int_num1);
        Debug.Log("otherClass_int2 : " + OthersClass.Instance.otherClass_int_num2);

    }
}

 

4. Action을 사용해서 다른 스크립트의 함수를 가져와서 쓰는 방법

 

using System;
public class ActionEvnet : MonoBehaviour
{
    public static Action Play_action;
    public void Awake()
    {
        Play_action = () => { Play(); Count(); };
    }
    public void Play()
    {
        Debug.Log("Print Play Function");
    }
    public void Count()
    {
        Debug.Log("1,2,3,4,5,6");
    }
}

 

Action을 static으로 생성해주고 원하는 함수(Play())를 변수명(Play_action)에 *람다 형식으로  넣어주면 된다.

하나의 Action 안에 여러개의 함수를 넣는 것도 가능하다.

*람다 형식 : (입력-매개-변수) =>{ 실행 - 문장}

 

https://url.kr/n4uv8g

 

[유니티 C# 강좌] 18. 익명 형식, 익명 메서드, 람다식, Func 대리자, Action 대리자

1. 익명 형식(Anonymous Type) C#에는 이름 없는 형식이 존재하는데, 이 것을 익명 형식이라고 합니다. 익명 형식을 사용하면 명시적으로 형식을 정의할 필요 없이 읽기 전용 속성 집합을 단일 개체로

coderzero.tistory.com

 

[사용하는 방법]

사용하려는 스크립트(ActionEvnet)와 원하는 액션(Play_action) 함수를 넣어주면

Play_action()에 관련된 함수들이 호출 되는 것을 확인 할 수 있다.

 

public class SampleScript : MonoBehaviour
{
    private void Start()
    {
        ActionEvnet.Play_action();
    }
}

 

728x90
반응형

댓글