반응형

Rigidbody.Addforce 사용할 오브젝트가 Rigidbody.Addforce함수를 여러번 사용할시 

Rigidbody.Addforce햇었던 값이 합해서 적용이 됩니다. 

 

ex)

처음에 Addforce(new vector3(0,0,1) * 100f); 호출후 바로 
Addforce(new vector3(0,1,0)*100f); 호출하면 vector3(0,1,0) 방향으로 나갈줄 알앗는데 

vector3(0,1,0) + vector3(0,0,1)  = vector3(0,1,1) 방향으로 나가더군요 ....

왜 함수 이름이 Addforce 인줄 알게 되엇답니다. 흠흠

 

그래서 이전 addForce 주웟던 것을 초기화 하려면 

 

 Rigidbody.velocity = vector3.zero; 
 Rigidbody.angularVelocity = vector3.zero; ( addTorque 사용시)

 

하시면 초기화됩니다.

 

 

 

이상입니다~

반응형
반응형

코루틴 시작시 StartCouroutine() 소량의 가비지가 쌓인다 
또한 yield 구문에서 불필요한 힙할당으로 가비지가 쌓이는경우가 있습니다.

아래 예입니다



1. yield return 0; 

   0 의값은 변수가 박싱처리되기 떄문에 박싱시 가비지를 생성하게됩니다

   그래서 yiedl return null 사용하는게 좋다


2. yield return new waitfForSeconds(1f);

아래 경우 반복문을 돌때마다 waitfForSeconds 를 생성하고 삭제하기떄문에 가비지가 생성됩니다.


 IEnumerator co_ChkDieTargetPlayer()

{

        while (true)

        {

yield return new waitfForSeconds(1f);

         }

}



2 경우 개선 

WaitForSeconds waitfor = new WaitForSeconds(1f);

IEnumerator co_ChkDieTargetPlayer()

{

        while (true)

        {

yield return waitfor ;

         }

}



반응형
반응형

OntriggerStay() 함수 사용시 주의 해야할점

tag 문자열 비교시 compareTag() 함수를 이용해서 비교 해라 그러지 않으면 OntriggerStay 함수 호출시 마다 가비지 컬렉터가 쌓이게 되어 
게임 부하를줄수 잇다.




나쁜 예)

public void OnTriggerEnter(Collider coll)

    {

        if (coll.tag == "Player")

        {

           

        }

    }



좋은 예)

public void OnTriggerEnter(Collider coll)

    {

        if (coll.CompareTag(playerTag))

        {

           

        }

    }






- 나쁜예 사용시 가비지가 쌓이는 증거 

 파란색 부분 GCAlloc 에 10KB 정보 GC가 쌓인것을 확인할수 잇다.




- 좋은예의 가비지가 쌓이지 않는 증거

GC Alloc 에 0B 이다.






반응형
반응형

데이터 컬렉션 을이용해 데이터를 담고 참조하곤합니다. 아래 예시와같이 말이죠.


 레벨

 언락종류

 언락슬롯

 6

21 

21 

36 

36 

51 

51 



위같이 레벨에 대해서 슬롯잠금 해제 할수 있는 잠금레벨 데이터 테이블이 있다고 하자.


 - 잠금 레벨 데이터 사용 예

ex) 6레벨에 아이템슬롯이 해제 되는경우, 2번쨰 슬롯이 잠금이 해제됨
ex) 6레벨에 스킬 슬롯이 해제 되는 경우, 2번쨰 슬롯이 잠금이 해제됨



 


자 위 예제 같이 기능이 구현 되기 위해 잠금레벨 데이터를 가지고 데이터들이 참조 되어야한다.

저 데이터들을 컬렉션(List, Dictionary,Queue,Stack 등) 에 담아서 참조하여 쓰면되는데 ,
제일 참조하기 쉬운 컬렉션이 Dictionary 일것이다.


그럼 위 테이블로 Dictionary 만들어 보자



우선 각테이블에 값을 담을 클래스를 만들자




언락종류가 잇으니 구별하기 쉽게 enum으로 정의해놓자





테이블 대로 클래스를 생성하여 데이터를 할당하자 

 => 예시 이므로 레벨 36 까지만 보여드리겟습니다 (일반적으로는 데이터를 엑셀로 만들어 cvs 로 뽑는다음 , json으로 읽어서 데이터를 불러 들여 데이터를 할당하곤 합니다. 여기서는 예제이니 하나하나 데이터 할당할게요) 









정의한 Dictionary 에 할당된 클래스들을 담으면 되겟죠 ?Dictionary<int, Info_UnlockTerm> Dic_unlock = new Dictionary<int, Info_UnlockTerm>(); 

하지만, 아래 그림 빨간부분과 같이 할당할 dictionary key값이 중복이된다는걸 꺠달을수 잇어요..


위테이블에 자세히 보면 레벨 부분이 21, 36, 51 이 두개씩이나 있네요 .

이렇게 되면 컬렉션에 담아지긴합니다만, 이전에 담앗던 key와 value는 사라지게 될거에요.

그래서 멀티키 사용하여 담도록합시다









아래그림과같이 Dictionary value 부분에 Dictionary를 넣는 부분인데,

보기엔 힘들어 보이지만, 별거 업어요 Dictionary 안에 Dictionary가 잇다고 생각하면됩니다.


이렇게 되면 같은 레벨에 다른 종류의 데이터를 넣을수 있게됩니다. 





아래와같이 사용 하면 됩니다.

Dictionary[레벨][언락종류] 이런식으로요


Info_unlockTerm unlock = Dictionary[레벨][언락종류] ; 이렇게 되겟죠 ?

보아하니 약간 2차배열을 쓰는거 같군요, Dictionary를 2차배열로 쓴다 생각해도 이해하기 괜찮을겁니다.









반응형
반응형

enum 문에 정의한 것들을 전부 처리하고 싶을떄가 잇습니다.


아래 예제와같이 typeof 에대한 enum 형태를 array로 반환해줘 처리할수 있습니다.






반응형
반응형


유니티 에서 보통 WWW 클래스를 통해 웹통신을 하엿는데 2017 버전부터 WWW를 대체할 UnityWebRequest  클래스가 등장햇습니다.

2018 에서는 아예 UnityWebRequest 를 권장하고 있습니다.

WWW 클래스가 나중에는 쓰여지질 않을텐데요 이에 UnityWebRequest  예제를 만들어 보앗습니다.



예제 1.








예제 2.



반응형
반응형

 

유니티 분석기능중 하나로 profiler 기능이 있는데요 프레임마다 cpu, gpu, memory 등등을 체크해주는 기능이죠
editor 상태에서 많이 쓰긴하는데 안드로이드 핸드폰 (모바일) 에서 Profiler 사용이 잘 안될떄가 잇더라구요 

 

여러번 시도하고 시행착오 끝에 되서 사용법을 올려봅니다.

 

Android 모바일 디바이스만 해당 되니 이점 유의하세요 

 

 

사용법 

 

1. 우선 APK 빌드을 하세요 , 이떄 Build Setting  > Development Build를 켠후 빌드 하세요!

 

 

 

2. ProjectSetting 에서 Packagename을 복사합니다

3. Command창을 열어 adb foward tcp:34999 localabstract:Unity-com.your.packageName

   입력후 엔터!  바로 "34999" 응답이 출력되면 연결완료!

 

4. Unity를 실행후 Profiler를 열어 아래사진처럼 AndroidPlayer(ADB@127.0.0.1:34999)를 선택,
  녹하(빨간점)을 눌러서 프로파일링이 되는지 확인.

  만약 안된다면 아래 특정포트 개방시켜줍니다 (5번 사항으로) 

 

 

 

5. "Window Defender 방화면" 에서 고급설정 으로 진입,

    아웃바운드규칙 에서 "새규칙" 를 클릭하여 아래 사진처럼 진행

 

 

7. 규치 추가 완료 하였으면 Unity 종료!

 

8. Command 창에 아래 명령 입력합니다 (디바이스가 연결중이던걸 끊는 행위)

   - adb kill-server

   - adb start-server

 

9. 다시 3번으로 이동해 진행합니다.

반응형
반응형

Raycast 를 사용하여 타겟에게 ray 를 쏴서 처리하고 있을때 

자신과 타겟사이에 오브젝트가 끼어들면 ray를 쏘지 못하게 되죠.

당연한 말이지만, raycast 사용중 자신과 타겟사이에 오브젝트가 끼어들어도 계속 타겟에게 ray를 쏘고 싶을때가 있습니다.


이럴경우 layermask를 쓰면 아주 좋은데요 , 우선 Raycast 오버로딩된 함수에 layermask를 어덯게 넣고 쓰는지 알아 보겟습니다.


우선 아래 사진처럼 타겟대상(사진에선 Player) 에게 Layer 를 설정해주세요









이제 자신에 해당하는 스크립트에 raycast 사용시 아래와같이 layermask 변수를 넣어주세요 

1
2
3
4
 
//특정 Layer만 raycast하기
RaycastHit hit;
float distance = 10f;
int layerMask = 1 << LayerMask.NameToLayer("Player");  // Player 레이어만 충돌 체크함
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), out hit, distance ,layerMask);
cs


그러면 raycast시 타겟 사이에 다른 오브젝트가 껴도 타겟만 쏘게 됩니다.






아래에 layermask 다른 예시가 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
//특정 Layer만 raycast하기
int layerMask = 1 << LayerMask.NameToLayer("Player");  // Player 레이어만 충돌 체크함
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);
 
//두개 레이어 raycast하기
int layerMask = (1 << LayerMask.NameToLayer("Player")) + (1 << LayerMask.NameToLayer("MyTeammate"));    // Player 와 MyTeammate 레이어만 충돌체크함
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);
 
 
//특정 layer만 raycast제외하기 (1)
int layerMask = (-1- (1 << LayerMask.NameToLayer("Player"));  // Everything에서 Player 레이어만 제외하고 충돌 체크함
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);
 
 
//특정 layer만 raycast제외하기 (2)
int layerMask = (1 << LayerMask.NameToLayer("Player"));  // Everything에서 Player 레이어만 제외하고 충돌 체크함
layerMask  = ~layerMask ;
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);

//특정 2개이상 layer raycast 제외하기 
int layerMask = ((1 << LayerMask.NameToLayer("Player")) | (1 << LayerMask.NameToLayer("GUN")));  // Everything에서 Player,GUN 레이어만 제외하고 충돌 체크함
layerMask  = ~layerMask ;
Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);
 
 
cs



이상입니다.

반응형

+ Recent posts