멍멍이네 블로그

Coroutine에서 bool을 이용해서 대기했다가 특정조건에 사용하는방법을 알고 싶어요
제가 2일전에 Coroutine 사용했을땐
yield return (bool 자료형 변수 = false);
Debug.Log(bool 자료형 변수값 );
라고 해두면
버튼을 클릭해서 변수값을 true로 바꿔주기전엔 Debug가 안찍혔던거 같은데;
잘되길래 놔뒀다가..
이번에 쓰려고 하는데 bool 자료형 변수가 값이 false인데 자꾸 넘어가네요..(Debug도 false로 찍힙니다)
사용법이 잘못된건지..
아니면 다른 사용법좀 가르쳐주십사 합니다.

--------------------------------------------------------------------------------------------

[답변]

IEnumerator test()
{
while(조건검사)
{
yield return null;
}

실행..
}

 

p.s. 결론은.. 조건대기할거면 그냥 Update를 쓰자..

처음 coroutine을 쓸땐 yield return bool변수의 false로 놔두면 대기했다가.. true로 바꾸면 그때 시작되는거 같았는데.. 잘못봤나보다.. 아니면 가능한지.. 이글을 보시는분 아시면 댓글좀! 

NGUI로 AddChild 할때 생성되는 오브젝트에게 값을주는방법이 궁금합니다.
서로 상하위 객체로 연결하지 않고 같은 패널 내 동등한 위치로.. 동일한 이름으로 여러개 생성할 생각입니다.
SendMessage로 오브젝트의 이동방향과 생성할오브젝트의 초기위치값을 보내줬는데..
SendMessage로는 하나의 자료형만을 보낼수 있어서..
예를들면 Vector3와 int와 string의 자료형의 값들을 주고싶은데 ...
어떻게해야될까요? ㅜ

---------------------------------------------------------------------------------

[답변]

AddChild()의 리턴값이 생성된 GameObject 입니다.
GameObject를받은 후, GetComponent등으로 스크립트를 직접 가져와서 제어하시거나 하는게 낫지 않을까요.

GameObject goChild = NGUITools.AddChild(PanelObject, ChildObject);
UserScript userScript = goChild.GetComponent<UserScript>();
userScript.Initialize(v);

이런식으로..

 

p.s. NGUITools.AddChild의 return값은 GameObject형이다!

아까 질문 올렸다가 자삭했습니다.
현재 생긴 문제가 UISpriteAnimation을 이용해서 SpriteAnimation을 줬는데요..
코드로 Sprite 이름을 바꿔준다던지.. 해서 재생할 SpriteAnimation 이름을 조절했는데..
문제는 제가 Setting에서 오브젝트 크기(localScale)과 SpriteName을 바꿔주는데..
Update문이 끝나고 나서 SpriteAnimation에 의해서 이미지가 바뀌면서 오브젝트 크기가 다시 1로 돌아옵니다.
Update(){
//크기변동
}
//원래 크기로 돌아옴
Update(){
//크기변동
}
//원래 크기로 돌아옴
이렇게 됩니다..
SpriteAnimation 크기조절도 가능한지..
아님 다른 해결방법을 알고 싶습니다.
꼭 코드에서 재생할 SpriteAnimation의 이름. atlas를 바꿔야 되구요..
Unity3D + NGUI 를 사용중입니다.

------------------------------------------------------------------------------------------

 [답변]

SpriteAnimation 코드 안에서 이미지가 변경될경우..
Make pixel perfect 인가를 호출하는걸로 알고 있습니다.
요것이 sprite의 이미지의 크기를 원래의 사이즈로 만드는 함수인데요~

요녀석을 주석을 시켜 버리시거나..

애니메이션의 사이즈를 애초에 작은 사이즈로 재생을 시켜야 될 경우에는

부모 오브젝트의 사이즈를 줄이시면 될것으로 압니다~ -> 제생각..;

ex > 하이라키 계층 구조에서

빈 게임 오브젝트를 생성하셔서
ㄴ Gameobject - > scale 0.7, 0.7, 1 이런식..
ㄴ 재생될 spriteAnimation

 

p.s. UISprite 스크립트가서 자체 수정을 했는데..

이미지를 맞춰서 세팅을 하던지.. 아니면 다른사람들 말처럼.. UISprite의 MakePixelPerfect() 메소드를 수정해서 쓰자! ( 내맘대로 수정함ㅋ )

NGUI 사용하고있어서 NGUI기능 중 PlaySound를 쓰는데
Loop 이랑 Stop이 없네요ㅜㅜ
NGUI 기능 내에서 처리하고 싶은데... Loop이랑 Stop 사용방법좀 가르쳐주세요~~

 ---------------------------------------------------------------------------

[답변]

 저도 NGUI를 사용하는데~ play사운드는 사용하는데 좀 불편한거 같아서~
빈 오브젝트를 생성하고 오디오 리스너를 가지고 다니면서 씬마다 지워지지 않게끔하고
스크립트를 작성해서 사운드를 출력해주는 식으로 하고 있습니다.
그래서 오디오 Source 안에있는 loop나 Stop도 손쉽게 쓸수 있게 만들었습니다.

결론은, 저거 저도 써봤는데 별로 막 좋은거 못느껴서..
아마 스크리트를 손보시거나 새로 하나 만들어서 쓰심이 나을듯 해요 갠적으로는 그럽니다.

 

p.s. NGUITools를 뒤져서 PlaySound메소드를 들어가서 뒤져보고 질문한거였는데..

답변도 그렇고.. PlaySound는 그냥 자체 AudioSource를 이용해서 Play, Stop 해야겠당..

VSync 가 주 원인이란말 듣고 끄니까 좀 렉이 덜하는데... 밑에 사진과 같이 중간중간에 MeshCount도 증가하고.. 뛰고 하는 부분이 있는데.. 속도를 잘 모르긴 하는데.. 사진을 보면 안끊기는거처럼 보이는데 막상 실행시키면 끊김이 눈에 조금씩 보이는지라..
이동오브젝트의 스크립트를 모두 꺼버렸구요,
생성된 오브젝트는 Update에서 transform.localPosition = new Vector3()로 이동합니다.
현재 기준 오브젝트에서 화면밖까지 가는데 오브젝트가 15개정도 먹혀서.. Pool로 20개정도 만들고 미리 만들어놓고 False하고있습니다.
CPU Usage는 GfxWaitForPresent에서 거의 80~90% 먹히고,
GPU는 Draw에서 65% RenderTexture.SetActive에서 35%정도 먹힙니다;;


------------------------------------------------------------------------------------------------------

[답변 정리!]

다른 질문과 조금 동일하기때문에 정리하자면...

VSync의 설정을 바꿔주면 1차적으로 조금 줄어든다(대신 배터리 사용량이 늘어난다는 말이 있던데 정확히는 모름!)

그리고 가비지컬렉션문제와 동일한데..

동적할당을 하면서 힙메모리가 가득차기 때문에 끊김이나 툭툭튀는현상이 발생!

= new 같은건 사용을 자제하면서 특히 Update메소드에서 호출하는건 자제하도록!

public int a = 100;
이렇게 변수 선언하고나서
이 스크립트가 연결되어있는 오브젝트를 선택하고 Inspector창에서 a의 변수값을 50으로 바꾸었습니다.
그런데 그뒤로 a = 1000000으로 바꿔도 a변수가 50으로 고정되어있는데..
Inspector창에 있는 a변수값을 다시 스크립트랑 연동시키려면 어떻게해야되나요 ?
public 변수 선언하고 Inspector창에서 변환을 안하면 계속 script랑 값이 연동되다가...
inspector창에서 한번이라도 바꾸면 고정되는거.. 그걸 푸는 방법을 질문하는겁니당 ㅜㅜㅜㅜ
어떻게보면 편한데.. 어떻게보면 불편하네요;;
다른 스크립트"들"이 참조하고있어서.. private로 바꾸면 에러가 나오고..ㅜ..

--------------------------------------------------------------------------------------------

[답변 1]

가장 쉬운 두가지 방법이 있는데요.

하나는 인스펙터에서 해당 컴포넌트 우측위에 톱니바퀴아이콘 클릭해서 리셋하면 초기화됩니다.
이게 제일 편하긴한데 다른 것도 다 초기화되는 문제가 있네요.

그리고 다른 하나는 해당 변수 위에 [System.NonSerialized] 를 입력하시고 조금 기다리시면
인스펙터에서 없어집니다. 없어진거 확인하시고 [System.NonSerialized]를 지우시면 그것만 초기값 그대로 생성됩니다.

 

[답변 2]

인스펙터에 값이 있다면 private으로 바꿔서 안보여도 그 값이 우선적용 됩니다.
우선 인스펙터에서 적은 값을 지우시구요.
인스펙터에선 사용안하면서 public으로 유지하시려면 [HideInInspector] 를 변쉬위나 앞에 달아주세요.

 

p.s. 답변1은 테스트해봤는데 2는 안해봄. 1번 답변대로 하면 확실히 되긴 하는데... 쨋든 귀찮은건 마찬가지 ㅜㅜ

유니티도 불편한점이 있구나 싶은..ㅜ..

Unity3D로 프로젝트 파일 만들고 폴더에 들어가면
Asset
Library
ProjectSettings
....
있잖아요..
거기서 Library에 들어가는 것이 무엇일까요?
두명이 다른작업을 했는데 Library용량차이가 3배이상 나네요

 ------------------------------------------------------------

[답변]

 Library 폴더는 알아서 생성되는 곳입니다.
svn등으로 공유하시려면 Assets 폴더와 ProjectSettings 폴더만 공유하시면 됩니다.
결론적으로..
두 분 다, Assets/ProjectSettings 폴더만 남기고 다 지운 후 새로 유니티에서 열어보세요.

 

 

 

p.s. meterial등.. 실행하면 기본적으로 남는데.. 안쓰려고 unity3d프로젝트에서 지워도 기록(?)이 남는듯 하다..

쓸데없는 용량만 쳐묵쳐묵... 한번씩 지우자!

프로파일러로 돌렸을 경우 GC.--- 에서 오래 걸리더라구요..
지금 확인하고 검색돌려보니 가비지컬렉션이라더라구요..
= new 를 많이써서.. 가비지 컬렉션이 많이 쌓여서 끊김이나 툭툭 튀는데요..
이거 없애기위해서 중간중간 정리를 해줘야되는데
언제.. 어디에서.. 어떻게 정리해야될지..
처음 사용하는 부분이라서.. 간단하게나마 조언을 얻고자 합니다 ㅜㅜ

-------------------------------------------------------------------------

[답변]

http://www.unitystudy.net/bbs/board.php?bo_table=dustin&wr_id=55 참고 하셔도 좋을 것 같습니다^^
유니티 스터디 펌~~

처음 앱 실행하면 다른 앱처럼 리소스를 처음 읽어오고싶은데 잘 모르겠네요 ㅜㅜ
asset[0] = AssetDatabase.LoadMainAssetAtPath("Assets/Resources");
BuildPipeline.BuildAssetBundle(asset[0], null, "Resources.unity3d", options);
해서 Assets폴더 안에 Resources 폴더를 Resources.unity3d로 Asset을 만들고 그걸 불러와서 쓰고싶은데...
저렇게 썻는데
1kb밖에 안되네요 ;;
 

----------------------------------------------------------------------------------------------------

[답변]

안드로이드
BuildPipeline.BuildAssetBundle(Selection.activeObject, 오브젝트배열, 배포파일 Path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.Android);