Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption 

 

GameObject obj = Resources.Load<GameObject>("Prefabs/Item");
obj.transform.parent = content.transform;

 

코드에서 프리팹을 불러온 후 인스턴스화된 게임 오브젝트로 바꿔주지 않고 바로 parent를 변경하면 에러가 발생한다.

 

GameObject obj = Instantiate(Resources.Load<GameObject>("Prefabs/Item"));
obj.transform.parent = content.transform;

 

 

 

2020.3 버전을 다운받았다.

너무 오랜만에 켜서 이것저것 찾아보다가 Device Simulator라는 기능을 써보고 싶어 추가하려는데 난 도저히 찾을 수 없었다.

 

그러다가 발견했다.

 

Edit >Project Settings > Package Manager에 들어가서 이 두 개를 체크해줘야 Package Manager에서 Device Simulator가  보인다.

 

 

 

 

이제 Package Manager를 켜보면 (밑에 refresh list를 누르면) 이렇게 Device Simulator를 찾을 수 있다. 

 

 

 

 

 

 

 

참고 자료;

패키지 매니저의 변경사항 in Unity 2020.1 - IndieGameMaker (unity3dstudy.com)

 

패키지 매니저의 변경사항 in Unity 2020.1

유니티 2020.1 버전에서 많은 변화중 Package Manager는 몇가지 소소한 변화가 있다. 에셋스토어 뷰의 통합 유니티 2020 버전부터는 에셋스토어에서 구매한 에셋들을 Package Manager에서 직접 다운로드 및

unity3dstudy.com

 

 

코루틴은 해당 코루틴을 동작시키는 스크립트가 달린 오브젝트가 비활성화 됐을 때 동작하지 않는다. 

 

 

 

public class ForCoroutineTest : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        StartCoroutine(TestCoroutine());  // 코루틴 활성화
        Invoke("ActiveFalse", 3.0f);  // 3초후 비활성화
    }

    IEnumerator TestCoroutine()
    {
        while (true)
        {
            yield return null;

            Debug.Log("활성화");
        }
    }

    void ActiveFalse()
    {
        this.gameObject.SetActive(false);
    }

}

 

빈 오브젝트를 하나 만들어서 SoundManager로 설정한다.

오브젝트 밑에는 AudioSource를 가진 빈 오브젝트들을 설정한 후 각자의 용도에 맞게 사용한다.

 

 

ex)

더보기

 

SoundManager에 AudioClip들을 저장하는 스크립트들을 달아놓고

parent인 SoundManager에 child인 Source 오브젝트들을 연결시켜 준다. 

SoundManager의 스크립트에 발자국 소리를 내는 함수를 만든다면

Foot_Source의 AudioSource를 이용하여 만들고 

UI의 Sound를 담당하는 함수를 만든다면

UI_Source의 AudioSource를 이용한다.

 

 

 

 

분명히 stopcoroutine을 했음에도 코루틴이 중지되지 않을 때

 

 

1)

 

coroutine my_coroutine;

my_coroutine = 코루틴함수이름();

StartCoroutine(my_coroutine);

 

StopCoroutine(my_coroutine);

 

 

1을 이용했는데도 중지되지 않아서 아예 코루틴을 없애버리고

코루틴보다는 비효율적이지만 반복을 이용하기 위해 InvokeRepeating을 넣었다.

 

InvokeRepeating("함수이름", 처음 함수 호출 대기 시간, 함수 호출 반복 시킬 시간 간격);

 

그리고 stopcoroutine대신 Invoke되는 함수를 중지시키는 CancelInvoke("함수이름"); 을 이용했다.

 

 

처음에는 꺼놓은 오브젝트를 특정상황에 Active시키고 싶어서 Find를 이용했는데

Find가 안되길래 왜 안될까 하고 봤더니 inactive 해놓은 오브젝트는 Find가 안된다고 한다.

 

inactive한 오브젝트는 찾을 수 없으니 활성화 된 부모의 밑에 넣어주고

그 부모의 밑에 들어간 SetActive(false)된 자식을 찾는다.

 

 

GameObject.Find("부모").transform.FindChild("내가찾을비활성화오브젝트").gameObject.SetActive(true);

 

그런데 막상 위에 코드를 써보니까

 

 

초록색 밑줄과 함께 이런 안내가 뜬다.

 

그래서 FindChild대신 Find를 썼다.

GameObject.Find("부모").transform.Find("내가찾을비활성화오브젝트").gameObject.SetActive(true);

 

그런데 몇 번째에 붙은 자식인지 알거나 항상 정해져 있으면 굳이 Find("내가찾을비활성화오브젝트") 하지 말고 getchild(몇 번째 자식인지)가 더 낫다.

 

 

- Canvas에서 겹치는 Image들의 우선순위는 Hierarchy의 순서



- 만약 UI가 클릭되지 않을 경우 가장 기본적인 의심으로는 Event System을 지우지 않았는지 확인하기

 

 

GameObject Balloon;

 

-

 

Balloon = (GameObject)Instantiate(BalloonPrefab, new Vector3(...), Quaternion.identity);

Balloon.transform.parent = gameObject.transform;

 

 

자식으로 붙일 때 transform을 이용해서 붙임

 

+)

마찬가지로 생성 할 때가 아니더라도

ObjectA.transform.parent = ObjectB.transform; 하면 자식으로 변경되어 Hierarchy 창에서 확인할 수 있다.

+ Recent posts