//구글콘솔 광고 추가가
728x90

invoke멈춤 현상이 궁금해져서 자료 조사하던 중 BeginInvoke를 알게 되었다.

그래서 찾아본 invoke와 BeginInvoke의 차이점.

 

Invoke는 컨트롤의 본인 스레드가 아닌 다른 스레드를 이용하여 해당 컨트롤 객체를 동기식으로 실행하는 방법.

BeginInvoke는 컨트롤의 본인 스레드가 아닌 다른 스레드를 이용하여 해당 컨트롤 객체를 비동기식으로 실행하는 방법.

 

두가지중 무엇을 사용해야 될지 고민이라면

계속 진행하기 전에 ui업데이트를 완료하려면 invoke. 요구사항이 없으면 BeginInvoke

 

BeginInvoke에 대해 더 자세하게 알고 싶다면

>> https://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke

 

시간될때 비동기 프로그래밍을 편리하게 사용하도록 나온 async await 에 대해서도 깊이 알아두자.

728x90
반응형

'c#' 카테고리의 다른 글

튜플(Tuples) 자료형 - 튜플 형식에 대해  (0) 2023.12.19
c# 다차원 배열과 가변배열  (0) 2023.12.15
async 와 await 키워드(비동기 함수)  (0) 2023.04.07
TCP VS UDP  (0) 2023.03.08
객체지향 프로그래밍  (0) 2023.03.08
728x90

c#의 async는 컴파이럴에게 해당 메서드가 await를 가지고 있음을 알려주는 역할이다.

해당 메서드 내에 await키워드를 사용할수 있게 만들어 주는 건데

메서드 내에 await를 1개 이상 가질수 있는데, 하나도 없는 경우라도 컴파일은 가능하지만 Warning메세지가 표시된다.

 

await는 비동기 작업의 흐름을 제어하는 키워드라 할수 있다.

피연산자가 나타내는 비동기 작업이 완료될때까지 수행을 중지한다.

 

형식은 반드시 void , Task, Task<T>를 반환해야 된다.

void를 사용하게 되면 비동기메서드를 호출 하는 쪽에서 비동기를 제어할수 없다. 종종 이벤트 핸들러로 사용할 때 

void를 사용하곤 한다고 한다. 

 

코루틴처럼 하나의 쓰레드가 비동기적으로 작업하는게 아니라 Task를 사용하므로 여러 쓰레드를 활용한다.

 

예제 및 참고

https://kangworld.tistory.com/25

728x90
반응형

'c#' 카테고리의 다른 글

튜플(Tuples) 자료형 - 튜플 형식에 대해  (0) 2023.12.19
c# 다차원 배열과 가변배열  (0) 2023.12.15
Invoke 와 BeginInvoke의 차이점  (1) 2023.12.14
TCP VS UDP  (0) 2023.03.08
객체지향 프로그래밍  (0) 2023.03.08
728x90
네트워킹 프로토콜 - UDP 와 TCP

컴퓨터 네트워크 세계에서 프로토콜이란 통신 시스템이 데이터를 교화하기 위해 사용하는 통신규칙이다.

이러한 규약을 통해 수신자가 정보(메세지) 내용을 표현하는 정보의 포맷 구성형태로 정보 코덱(인코딩/ 디코딩)에 사용한다.

프로토콜을 서비스의 유형에 따라 두종류인 UDP와 TCP로 구분되며, 이 둘 모두 데이터 압축 패키지 방식과 네트워크의 전송 및 수집 방법을 의미한다.


TCP와 UDP를 한번에 설명하자면...

TCP는 입에 물을 대고 마신다라면, UDP는 얼굴에 물을 뿌리는 행동(입벌리고 있음) 

TCP UDP
연결형 서비스로 가상 회선 방식을 제공 (연결형 프로토콜)
데이터의 전송 순서 보장
데이터의 경계를 구분하지 않음
신뢰성있는 데이터 전송
UDP보다 전송속도가 느림
일대일 통신
--------------------------------------------------------------------------------
브라우저나 메일 동의 등 일반적인 애플리케이션이 데이터를 송, 수신할 경우
비연결 서비스로 데이터그램 방식을 제공(비연결형 프로토콜)
데이터의 경계를 구분
비 신뢰성 데이터 전송(재전송 존재x)
패킷 오버헤드가 적어 네트워크 부하 감소
혼잡 제어를 하지 않기 때문에 TCP보다 빠름
일대일, 일대다, 다대다 통신
----------------------------------------------------------------------------------
서버에 대한 조회 등에서 짧은 제어용 데이터를 송, 수신 할 경우.
음성이나 동영상 데이터를 수신할 경우

참고 

https://wormwlrm.github.io/2021/09/23/Overview-of-TCP-and-UDP.html

 

10분 만에 훑어보는 TCP와 UDP - 재그지그의 개발 블로그

OSI 4계층에서 동작하는 TCP와 UDP의 특징과 차이점에 대해 간략히 정리해봅니다.

wormwlrm.github.io


< TCP >

연결 지향 방식은 송신자와 수신자가 1:1로 연결 상태를 유지하면서 통신하는 것을 의미한다.

이 방식은 데이터를 보내기 전에는 연결 설정단계를, 데이터를 보낸 후에는 연결 종료단계를 거쳐야 한다.

데이터를 교환하는 데 있어 좀더 안전하고 믿을 수 있는 환경을 제공하지만, 교환 전후로 과정이 좀더 복잡하다.

 

< UDP >

비연결 방식은 송신자와 수신자가 연결 상태를 유지하지 않고 통신하는 것을 의미한다.

데이터 송신자는 수신자의 수신 여부와 상관없이 일방적으로 데이터를 뿌리고 끝낸다. 송신자 입장에서는 간단한 방법이지만, 수신자 입장에서는 데이터가 정확한지도 알수 없고, 데이터의 순서도 보장할수 없으며, 심지어 못받을수도 있다.

728x90
반응형
728x90

1.추상화란

다른 프로그래머가 볼수 있는 스크립트에서 복잡한 코드를 제거하고 실제로 필요한 기능만 노출하는 프로세스.

세부 정보를 추상화하면 중복코드를 줄이고 가장 유용한 기능에 쉽게 엑세스 할수 있다.

 

start()함수에서 for문을 사용해서 적을 생성을 하게 되는 경우, 또 다른 적웨이브를 생성하려면 동일한 코드라인을 계속 반복해서 재작성하거나 복사해서 붙여넣는 것은 비효율 적이며 오류를 발생하기 쉽다.

이런 경우 생성기능 자체 메서드(ex. void SpawnEnemyWave())로 분리를 하고 start()함수에서 해당 기능을 호출함으로, 스크립트 어디서든 단일 코드 라인으로 적을 생성할 수 있다. 또한 이후 리팩터링이 필요하면 단일 위치에서 작업을 진행할수 있다.

 

2. 상속이란

부모 클래스를 생성하는 프로세스이며 부모 클래스에서 다른 자식 클래스를 생성할수 있다. 자식 클래스는 부모 클래스의 모든 기능을 자동으로 가져오며, 이를 상속이라 한다.

 

728x90
반응형

'c#' 카테고리의 다른 글

튜플(Tuples) 자료형 - 튜플 형식에 대해  (0) 2023.12.19
c# 다차원 배열과 가변배열  (0) 2023.12.15
Invoke 와 BeginInvoke의 차이점  (1) 2023.12.14
async 와 await 키워드(비동기 함수)  (0) 2023.04.07
TCP VS UDP  (0) 2023.03.08
728x90

1. ui 부모 객체에 Grapic RayCast 컴포넌트 추가

2. 버튼위에서 다른 무언가로 버튼을 가려진게 없는지 확인

3. 씬안에 이벤트 시스템이 없는 지 확인

728x90
반응형
728x90

Layer Mask 와 Layer Tag 둘다 유니티에서 추가 해서 사용할 수 있다.


Tag : 각 게임 오브젝트를 구분하는 용도로 사용. OnCollision 과 OnTrigger에서 tag를 이용해 충돌한 오브젝트를 검사할수 있다.

Layer : 충돌 체크를 할수 있다. 또한 카메라 컴포넌트에서 컬링 마스크를 설정하기 위한 용도로 사용될수 있다.


int layerMask = (1 << 레이어 번호);   ex >> int layerMask = (1 << 8);

LayerMask layerMask = LayerMask.GetMask("레이어 이름");  

int layerMask = (1 << 레이어 번호) | (1 << 레이어 번호);

LayerMask layerMask = LayerMask.GetMask("레이어 이름") | LayerMask.GetMask("레이어 이름"); 

  •  | 를 사용하여 또는 이라는 의미로 레이어를 추가 할 수 있음

if (Input.GetMouseButtonDown(0)) //왼쪽 마우스 클릭시
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            Debug.DrawRay(Camera.main.transform.position, ray.direction * 100f, Color.red, 1.0f);

            LayerMask layerMask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall");

            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 100f , layerMask))
            {
                Debug.Log($"Raycast Camera : {hit.collider.gameObject.name}");
            }
        }

 

728x90
반응형
728x90

   // transform.position = 좌표를 변환할때 씀

   // 방향을 가지고 연산을 할때는 transform.TransformDirection() 사용. >> 로컬에서 월드로 변환
  Vector3 look = transform.TransformDirection(Vector3.forward); // 플레이어가 바라보고 있는 방향을 월드로 표현한 벡터.
  Debug.DrawRay(transform.position + Vector3.up, look * 10 ,Color.green); // screen에서 플레이어 레이케스트 그려주기.


< 두가지의 레이케스트 구현 >
        1. 모든애들을 관통하는 레이케스트
        RaycastHit[] hits;
        hits = Physics.RaycastAll(transform.position + Vector3.up, look * 10, 10);
        foreach (RaycastHit _hit in hits)
        {
            Debug.Log($"Raycast : {_hit.collider.gameObject.name} !");
        }

        2. 하나만 타겟팅하는 레이케스트
        RaycastHit hit;
        if (Physics.Raycast(transform.position + Vector3.up , transform.forward * 10, out hit, 10))
        {
            Debug.Log($"Raycast : {hit.collider.gameObject.name} !");
        }


       if (Input.GetMouseButtonDown(0)) //왼쪽 마우스 클릭시
        {
           //클릭한 좌표의 월드좌표를 구하자 //레이가 쏴지는 과정
            Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane)); //마우스의 월드포지션
            Vector3 dir = mousePos - Camera.main.transform.position; //카메라 위치에서 화면까지 가는 방향벡터.
            dir = dir.normalized; //크기를 강제로 1로 해줘서 방향은 똑같지만 크기는 1로 만들어 둔다.


            //  dir * 100f >> Debug.DrawRay( , 방향 * 거리)를 넣어줘야 하니까 레이케스트에서 max 거리해준 만큼 곱하자
            Debug.DrawRay(Camera.main.transform.position, dir * 100f, Color.red, 1.0f);
         

            if (Physics.Raycast(Camera.main.transform.position, dir, out hit, 100.0f))  // 값이 true 일경우 무언가 충돌한거지
            {
                Debug.Log($"Raycast Camera : {hit.collider.gameObject.name}");
            }
        }


   < 마우스 좌표 확인 >

        // 최종적으로 화면안에 나오게 하려면 
        // Local <-> World <-> Viewport <-> Screen (2D 화면) Viewport 와 Screen 는 거의 비슷

       

        // Input.mousePosition >> 현재 마우스 좌표를 픽셀 좌표로 뽑아온다.
        Debug.Log(Input.mousePosition); // screen 좌표 출력(픽셀좌표가 곧 screen) 

 

        // Viewport 좌표 출력(픽셀과 상관없이 화면 비율의 좌표)
        Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition)); 
       


< 이미 유니티에 만들어 져있는 Ray를 이용해서 깔끔하게 작업하기 >

if (Input.GetMouseButtonDown(0)) //왼쪽 마우스 클릭시
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            Debug.DrawRay(Camera.main.transform.position, ray.direction * 100f, Color.red, 1.0f);

            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 100f))
            {
                Debug.Log($"Raycast Camera : {hit.collider.gameObject.name}");
            }       
        }


 

728x90
반응형
728x90

< RigidBody >

게임 오브젝트가 물리제어로 동작하게 한다. (중력의 영향을 받을수 있고 충돌체크를 할수있다.)

프로퍼티 : 

  • Mass : 오브젝트의 질량. ( 디폴트값은 킬로그램 )
  • Drag : 오브젝트가 힘에 의해 움직일 때, 공기저항의 영향을 미치는 정도. (0이면 공기저항 X, 무한대라면 오브젝트 즉시 정지)
  • Angular Drag : 오브젝트가 토크로 회전할 때 공기저항이 영향을 미치는 정도. (0이면 공기저항 X, 무한대라 하더라도 오브젝트의 회전이 멈추지 않음)
  • Use Gravity : 오브젝트가 중력의 영향을 받게 할지 안할지 체크.
  • Is Kinematic : 체크시 물리 시스템 무효(충돌체크 혹은 트리거 체크를 확인 하려면 체크 해제)
  • Freeze Position : 월드좌표계의 x, y, z축에서 이동하는 리지드바디를 선택적으로 중지.
  • Freeze Rotation : 로컬좌표계의 x, y, z축에서 회전하는 리지드바디를 선택적으로 중지

< Collision >

  1. 충돌 체크를 하기위해 사용하며, 충돌체크를 확인 하려면 오브젝트안에 RigidBody 컴포넌트가 붙어있어야 한다. (isKinematic은 체크 해제)
  2. 체크할 오브젝트들 안에 Collider 컴포넌트가 붙어있어야 한다.(isTrigger 체크를 해제 해줘야 Collision 확인 가능)

Collision 사용 예시 : 

- 플레이어와 충돌되는 모든 오브젝트 확인 ( 건물, 몬스터 등)

- 몬스터에게 닿는 플레이어의 피격 오브젝트 (총알 등)


< Trigger >

  1. 물리와 전혀 상관없이 범위안에 들어왔는지를 확인하기 위해 사용하며, 체크할 오브젝트들 안에 Collider 컴포넌트가 붙어있어야 한다.
  2. 체크할 오브젝트들 중 하나에는 isTrigger 체크가 되어있어야 하며, RigidBody 컴포넌트가 붙어있어야 한다.

Trigger 사용 예시 :

- 플레이어의 스킬 관련(무기나, 스킬에 Trigger를 붙여 체크)

- 플레이어의 이동 관련 (순간이동 위치, 씬 이동 등)

728x90
반응형

+ Recent posts