<title>유니티 코딩 중 메모</title>
using System.Text; private StringBuilder mSbFPS = new StringBuilder( 256 ); // 스트링 만들기 { mSbFPS.Remove( 0, mSbFPS.Length ); // 특정 format에 맞춰 스트링 빌드 mSbFPS.AppendFormat( "{0:f2}\nm:{1:f2},x:{2:f2},v:{3}", fps, minFrames, maxFrames, (mFpsSum/mFpsSumCnt) ); } UILabel mLabel; // UILabel을 설정한다. // 최종 출력 mLabel.text = mSbFPS.ToString();
2차원 Array를 Inspector에 보여주고 싶을때,
//[System.Serializable]가 없으면 인스펙터에 보이지 않았다. [System.Serializable] class SimpleAniData { public Texture[] data; }; [System.Serializable] class SimpleAni : : MonoBehaviour { public SimpleAniData[] animationList; // // 아래방식도 보이지 않았었다. //public Texture[][] animationList; }
GameObject를 비활성활 상태로 만들고 필요할때 활성화할때.
gameObject.SetActive(false);
로 비활성 상태로 만들고,
gameObject.SetActive(true)
호출해서 활성화한다.
그리고,
중첩된 클래스에 [System.Serializable]가 클래스 선언 위부분에 추가 되어야, 제대로 인식한다.
아래 예제처럼 되어야, 인스펙터에 Menu를 선택했을 때, firstMenu 클래스의 menuName이 제대로 나온다.
public class Menu : MonoBehaviour { [System.Serializable] public class MenuItem { public string menuName; } public MenuItem firstMenu; }
List로 만든 배열을 (어떤타입)[] 과 같은 형태의 파라미터로 넘겨야 할때.
List<GUIContent> itemContent = new List<GUIContent>(); itemContent.Add( new GUIContent(..) ); // 몇개 더 만들었다고 설정하고, // GUI.SelectionGrid() 함수 같은 곳에 GUIContent[] 배열 타입의 값을 파라미터로 넘겨줘야 할때 GUI.SelectionGrid( ... itemContent.ToArray() ... );
public UserItem[] a_items;
이렇게 선언만 해둬도, 인스펙터에 표시도 되고 값도 입력해서 사용할 수 있었다.
평면 메시에 (스프라이트 용도의) 텍스쳐 입힐때.. 이게 맞나? 잘 모르겠네.
float _l = 1.0f/texWidth * spriteTopLeft.x; float _t = 1.0f/texHeight * spriteTopLeft.y; float _r = 1.0f/texWidth * (spriteSize.x - spriteTopLeft.x); float _b = 1.0f/texHeight * (spriteSize.y - spriteTopLeft.y); _mesh.uv = new Vector2[] { new Vector2( _l, _t ), new Vector2( _l, _b ), new Vector2( _r, _t ), new Vector2( _r, _b ) };
void Start() { StartCoroutine( sampleCoroutine() ); } IEnumerator sampleCoroutine() { // 어쩌구 저쩌구 //... yield return new WaitForSeconds( 1.0f / 24f ); // WaitForSeconds()는 소수점도 받나보구만. }
코루틴 클래스
이징 공식
공식의 적용 모드
각 움직임에 대한 라이브 데모
IIS는 mime 등록이 안되어 있으면 다운로드가 되지 않으니, iis 웹 설정에 “.unity3d”에 대한 mime를 추가해야 한다.
더 좋은 방법 없나..
GameObj_1.transform.position = GameObj_2.transform.position; GameObj_1.transform.transform = GameObj_2.transform.transform;
public class example : MonoBehaviour { void Example() { transform.Translate(0, 1, 0); GetComponent<Transform>().Translate(0, 1, 0); } } public class example : MonoBehaviour { void Update() { OtherScript otherScript = GetComponent<OtherScript>(); otherScript.DoSomething(); } }
public class example : MonoBehaviour { void Start() { GameObject go = GameObject.Find("SomeGuy"); go.GetComponent<OtherScript>().DoSomething(); GameObject player = GameObject.FindWithTag("Player"); player.GetComponent<OtherScript>().DoSomething(); } }
임의의 오브젝트를 Path를 따라 움직이게 만든다. 움직이는 방향은 궤도 회전 방식.
// 이런 식으로.. void OnDrawGizmos() { Gizmos.DrawWireSphere(transform.position,.25f); }
public Transform[] _path; void OnDrawGizmos() { iTween.DrawPath(path); } // iTween의 Path 파라미터에 _path를 추가해서 이 경로 만큼 이동하게 한다. void Start() { iTween.MoveTo( gameObject, iTween.Hash( "path",_path, "time",1, "easetype",iTween.EaseType.linear, "looptype",iTween.LoopType.loop, "movetopath",false) ); }
랜덤한 회전과, 각 tween 방식을 확인하기 위한 샘플 코드
public class cubeTexture : MonoBehaviour { public float tweenTime = 3f; // 인스펙터에서 직접 정하고 싶으면 코멘트 삭제 //public iTween.EaseType easeType = iTween.EaseType.easeOutExpo; void Start () { // tween 움직임을 랜덤하게 선택 iTween.EaseType _easytype = (iTween.EaseType)Random.Range( 0, 31 ); // 랜덤 로테이션으로 무작위 회전값을 얻고, // "oncomplete" 옵션을 추가해서, 움직임이 끝나면 새로운 움직임을 새로 추가 iTween.RotateTo( gameObject, iTween.Hash( "rotation", Random.rotation.eulerAngles, "time", tweenTime, "oncomplete","rotateTest", "easeType",_easytype )); } public void rotateTest() { iTween.EaseType _easytype = (iTween.EaseType)Random.Range( 0, 31 ); iTween.RotateTo( gameObject, iTween.Hash( "rotation", Random.rotation.eulerAngles, "time", tweenTime, "oncomplete","rotateTest", "easeType",_easytype )); } }
Gizmo를 활용해서 EmptyObject
void OnDrawGizmos() { Gizmos.DrawWireSphere(transform.position,.25f); }
is trigger가 켜서 OnTriggerEnter() 함수를 만들어 두면 충돌 되었을때에 뭔가 할 수 있지만, 충돌 처리는 무시된다.
Collider.OnCollisionEnter()를 사용하면 충돌된 시점에 충돌 효과는 계속 처리하면서 뭔가 할 수 있다.
public class SampleObject : MonoBehaviour { protected bool isFirstCollision = true; void OnCollisionEnter( Collision other_ ) { // 첫번째 충돌에서.. 뭔가 하는 경우. if( isFirstCollision == true ) { Debug.Log( "ta" + other_.gameObject.name ); isFirstCollision = false; } } }
레퍼런스