프로그래밍/C#2016. 12. 30. 22:47

일단 둘의 공통점은 둘다 레퍼런스 타입 이라는 것. 그리고 사용 목적이 비슷하다는 점.(둘다 메소드 내에서 어떤 값을 처리하는 용도.)


둘의 차이점은 

ref는 주로 메소드 내에서 원래 있던 값을 수정하고자 할 때 사용한다.

따라서 메소드 수행 전 해당 변수값이 미리 초기화가 되어 있어야 하고.


out는주로 메소드 내에서 생성된 새로운 값을 반환해 사용하고자 할 때 사용한다. 

따라서 해당 변수가 미리 초기화 되어 있을 필요는 없고.              

선언만 되어있는 상태여도 작동한다. 하지만 메소드 안에서 해당 값을 반드시 할당 해 주어야 한다.

'프로그래밍 > C#' 카테고리의 다른 글

가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
c++ 의 템플릿과 c#의 제네릭  (0) 2016.12.29
c# 개념에대해 정리가 잘된곳  (0) 2016.11.02
Posted by JinFluenza
프로그래밍/C#2016. 12. 29. 10:43

http://blog.secmem.org/192

'프로그래밍 > C#' 카테고리의 다른 글

가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
c# ref , out 키워드의 차이  (0) 2016.12.30
c# 개념에대해 정리가 잘된곳  (0) 2016.11.02
Posted by JinFluenza
프로그래밍/유니티2016. 11. 11. 08:43


플레이어가 죽었을때, 몬스터들의 행동을 처리하는 두가지 방법이 나와서 소개해보고자 합니다.



첫번째 방법 입니다.

 

플레이어가 죽었다(체력이 0이하가 됬을때) ->PlayerDie 함수를 호출한다. 

PlayerDie 함수 에서는 모든 몬스터의 게임 오브젝트를 찾아서 하나하나 플레이어의 죽음을 처리한다.(플레이어가 죽었으니 애니메이션을 종료하라던지의)


void PlayerDie()

{

//FindGameObjectsWithTag()함수는 인자로 넘겨준 태그를 갖고있는 모든 게임오브젝트를 찾아서 배열로 반환.

GameObject[] monsters = GameObject.FindGameObjectsWithTag("MONSTER");




foreach(GameObject monster in monsters)

{

//SendMessage함수는 특정 게임오브젝트의 함수를 호출하는 명령입니다.

//첫번째 인자는 해당 게임오브젝트의 함수명,두번째는 옵션입니다.

monster.SendMessage("OnPlayerDie",SendMessageOptions.DontRequireReceiver);

}


}


이런식으로 플레이어가 죽었을때 모든 몬스터들의 게임오브젝트를 받아와서 직접 처리하는 방법이 있습니다.


하지만 이 방법은 성능에  문제가 많습니다.



두번째 방법.

원리는 간단합니다. 플레이어가 죽었을때, 유니티 엔진에 플레이어가 죽었다고 알려줘서 시스템에서 이벤트를

발생시킵니다. 이때 이 이벤트에 연결된 모든 몬스터에서 해당 동작을 수행하게 하는 방법입니다.

이를 위해서 Delegate,Event를 사용합니다. (Delegate,Event 에대한 설명은 http://blog.eairship.kr/151 참조..)


플레이어 스크립트에 다음과 같이 딜리게이트 , 이벤트를 선언합니다.


public delegate void PlayerDieHandler();

public static event PlayerDieHandler OnPlayerDie;


그리고 플레이어가 죽었을때 이벤트를 발생시킵니다.

if(this.hp<=0)

{

OnPlayerDie();

}


이벤트를 선언하고 발생시킬 준비를 마쳤습니다. 이제 몬스터에서 OnPlayerDie 이벤트에 반응할 특정 함수를 연결시키기만 하면 됩니다.


몬스터 스크립트에 다음과 같은 형식으로 만듭니다.


void OnEnable()

{

     PlayerScript.OnPlayerDie += this.OnPlayerDie;

}


void OnDisable()

{

PlayerScript.OnPlayerDie -= this.OnPlayerDie;

}


void OnPlayerDie()

{

//플레이어가 죽었으니 길찾기를 중지해라.

//플레이어가 죽었으니 춤추는 애니메이션을 실행해라

//던지의..

}


이제 플레이어에서 OnPlayerDie() 이벤트를 발생시키면 몬스터의 OnPlayerDie() 함수들을 호출하게 됩니다.


OnEnable()과 OnDisable() 은 스크립트가 활성화,비활성화 될 때 수행되는 함수이며.

이벤트의 연결 및 해지는 반드시 이 함수 안에서 다음과 같은 문법으로 처리해야 한다고 합니다. 


이벤트 연결 : (이벤트가 선언된 클래스명).(이벤트명) +=(이벤트 발생 시 호출될 함수)

이벤트 해지 : (이벤트가 선언된 클래스명).(이벤트명) -=(이벤트 발생 시 호출될 함수)



-참고서적 절대강좌 유니티5










'프로그래밍 > 유니티' 카테고리의 다른 글

유니티 비주얼스튜디오 ctrl + ' 단축키 설정법  (0) 2017.03.14
다이나믹 메시  (0) 2017.01.04
유니티 기본 이벤트 함수  (0) 2016.11.11
Physics.OverlapSphere,Quaternion.Lerp  (0) 2016.11.10
Coroutine  (0) 2016.11.09
Posted by JinFluenza
프로그래밍/유니티2016. 11. 11. 05:43

출처 : 유니티 메뉴얼 :  https://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html

다음 그림은 스크립트의 유효기간 동안 이벤트 함수의 순서와 반복 처리를 정리 한 것입니다.

자주 사용되는 함수 정리


Awake() : 스크립트가 실행될 때 딱 한번만 호출됨. Start함수가 호출되기 전에 먼저 실행되고.

스크립트가 비활성화돼 있어도 실행된다고 함. 코루틴으로는 실행 불가능.


Start()  : Update() 함수 호출전에 딱 한번만 호출된다. Awake()와 다른점은 스크립트가 활성화 되어있어야 호출된다는 점.

다른스크립트의 Awake()가 모두 호출된 후에 실행된다. 코루틴으로 실행 가능하다.


Update() : 매 프레임 마다 호출되는 함수로 주로 게임의 핵심 로직을 여기에 작성한다. 스크립트가 활성화 되어 있어야 실행된다.


LateUpdate() : 모든 Update()함수가 호출되고 나서 한 번씩 호출된다. 순차적으로 실행하는 로직에 사용하면 좋고, 카메라 이동 로직에 주로 사용된다고

한다.  마찬가지로 스크립트가 활성화돼 있어야 실행이 된다.


FixedUpdate(): 이 함수는 Update()보다 자주 호출되는 경우가 많다. 프레임 속도가 낮은 경우에는 프레임마다 여러번 호출 될 수도 있다.

그러나 프레임 속도가 높은 경우에는 프레임간에 호출 될 수는 없다. 모든 물리적 특성 계산 및 업데이트는 FixedUpdate() 이후에 발생한다.

그리고 이 함수 내에서는 Time.deltaTime 값을 곱할 필요가 없는데 왜냐하면 프레임 속도와 독립적으로 FixedUpdate()만의 신뢰 할 수 있는 타이머에서 호출되기 때문이라고 한다. 타이머에 따라서 발생하는 주기가 일정하다.

(Edit -> Project setting -> Time 메뉴에 들어가면 발생 주기를 직접 입력 할 수 있다.)


OnEnable() : 게임 오브젝트 또는 스크립트가 활성화됐을 때 호출된다. 코루틴으로는 실행이 불가능.


OnDisable() : 게임 오브젝트 또는 스크립트가 비활성화됐을 때 호출된다. 코루틴으로는 실행이 불가능.



*주의 :  오타를 잡아주지 못하기 때문에 스펠링을 정확하게 써야 원하는 방향으로 작동한다.




'프로그래밍 > 유니티' 카테고리의 다른 글

유니티 비주얼스튜디오 ctrl + ' 단축키 설정법  (0) 2017.03.14
다이나믹 메시  (0) 2017.01.04
이벤트 활용  (0) 2016.11.11
Physics.OverlapSphere,Quaternion.Lerp  (0) 2016.11.10
Coroutine  (0) 2016.11.09
Posted by JinFluenza
프로그래밍/유니티2016. 11. 10. 02:32

간단한 소스코드

실행영상입니다.

Collider[] collisions = Physics.OverlapSphere(me.position, 20.0f); 요구문을 통해 collisions에 현재 위치에서

반경 20거리의 있는 모든 Collider 컴포넌트 정보를 받아옵니다.

그중에서 태그가 ENEMY(빨간색 큐브) 인것을 찾으면 타겟으로 설정하고 이것을 이용해 회전각을 구해서 회전합니다.


코드상 문제가 있는것은 댓글로 알려주시면 정말 감사하겠습니다..  많은 도움이 됩니다.



'프로그래밍 > 유니티' 카테고리의 다른 글

유니티 비주얼스튜디오 ctrl + ' 단축키 설정법  (0) 2017.03.14
다이나믹 메시  (0) 2017.01.04
이벤트 활용  (0) 2016.11.11
유니티 기본 이벤트 함수  (0) 2016.11.11
Coroutine  (0) 2016.11.09
Posted by JinFluenza
프로그래밍/유니티2016. 11. 9. 02:28
유니티 메뉴얼에서 본 정보인데 까먹기전에 여기에 복사해논다.

코루틴은 실행을 중지하여 Unity에 제어권을 돌려주고, 그러나 계속할 때는 다음 프레임에서 중지한 곳부터 실행을 계속할 수 있는 기능입니다. C#에서 코루틴은 다음과 같이 선언합니다:

IEnumerator Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null;
    }
}

즉, 이것은 IEnumerator 형식을 반환값으로 가지며 yield return 구문을 어디엔가 포함하고 있는 함수입니다. yield return 행은 실행을 중지하고 다음 프레임에서 실행을 재개할 수 있는 지점입니다. 코루틴을 실행하려면 StartCoroutine 함수를 사용합니다. \n

void Update() {
    if (Input.GetKeyDown("f")) {
        StartCoroutine("Fade");
    }
}



적이 많은 경우에 이 함수를 매 프레임 호출 하여 현저한 오버 헤드를 초래할 지도 모릅니다. 그러나 코루틴을 사용하여 1/10 초 간격으로 호출할 수 있습니다:

IEnumerator DoCheck() {
    for(;;) {
        ProximityCheck;
        yield return new WaitForSeconds(.1f);
    }
}

따라서 게임에 악영향을 주지 않고 체크 횟수를 비약적으로 감소시킬 수 있습니다.



StopAllCoroutines() 이라는 함수가 있는데

해당 클래스 내에서 진행되고 있는 코루틴 함수들을 전부 중지시킵니다.



보다 자세한 설명

http://unityindepth.tistory.com/21 여기에 잘 나와있습니다



그리고.. StartCoruotine(함수명()) 으로 실행한 코루틴은 StopCoroutine으로 멈출수 없다고 합니다.

함수명() 대신에 "함수명" 으로 실행해야 StopCoroutine("함수명") 으로 멈출수 있다고 하는데; 버그인지 뭔지는 알아봐야 할 것 같네요


'프로그래밍 > 유니티' 카테고리의 다른 글

유니티 비주얼스튜디오 ctrl + ' 단축키 설정법  (0) 2017.03.14
다이나믹 메시  (0) 2017.01.04
이벤트 활용  (0) 2016.11.11
유니티 기본 이벤트 함수  (0) 2016.11.11
Physics.OverlapSphere,Quaternion.Lerp  (0) 2016.11.10
Posted by JinFluenza
프로그래밍/C#2016. 11. 2. 18:37

http://mrw0119.tistory.com

 

http://blog.eairship.kr/145

요기에 c# 카테고리에 들어가보면 설명이 친절하게 잘 되어있습니다.

'프로그래밍 > C#' 카테고리의 다른 글

가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
c# ref , out 키워드의 차이  (0) 2016.12.30
c++ 의 템플릿과 c#의 제네릭  (0) 2016.12.29
Posted by JinFluenza
프로그래밍/DIrectx92016. 9. 20. 04:58

파티클을 이용해 만들어봤습니다.

바운딩박스 밖으로 넘어가면 리셋되서 재생성 됩니다.

요걸 잘활용하면 왠만한 효과들은 만들수 있을것 같습니다~

'프로그래밍 > DIrectx9' 카테고리의 다른 글

Directx 다익스트라 알고리즘,에이스타알고리즘 적용.  (0) 2016.09.09
DirectX9 픽킹 개념.  (0) 2016.08.29
파일 읽어오기..  (0) 2016.08.18
Posted by JinFluenza
프로그래밍/DIrectx92016. 9. 9. 07:05

이번에 다익스트라 알고리즘을 적용한 캐릭터 이동을 구현해보았습니다.

windows api 공부할때는 길찾기를 사용할때 에이스타알고리즘만 사용해봤으나.. 이번에 다익스트라 알고리즘을 3d환경에서 한번 적용해 보았습니다.

이동 경로에 장애물이 있다면 다익스트라 알고리즘을 통해 이동하고, 장애물이 없다면 해당 좌표로 바로 이동하는 방식입니다.


이건 에이스타 알고리즘을 적용한 케릭터 이동입니다.

바닥을 깔고 어떻게 타일을 이용할지 고민하다가 삼각형의 끝점을 타일처럼 이용해서 만들어봤습니다.

허나 이방법은 바닥이 타일일 경우에만 사용 가능하므로,, 시간이 나면 노드를 이용한 에이스타 알고르즘도 한번 만들어 봐야 겠습니다.

어제오늘 이것들 하느라고 고생했는데 다행히 원하는 결과가 나와서 기분은 좋네요 ㅎㅎ

'프로그래밍 > DIrectx9' 카테고리의 다른 글

파티클을 이용한 눈이내리는 효과  (0) 2016.09.20
DirectX9 픽킹 개념.  (0) 2016.08.29
파일 읽어오기..  (0) 2016.08.18
Posted by JinFluenza
프로그래밍/C++2016. 9. 3. 18:03

STL의 컨테이너는 처음할당한 메모리 크기보다 데이터가 많아질경우.

메모리를 재할당 하는 작업을 한다.

원래 갖고있던 메모리의 데이터를 새 메모리(크기가 더  큰)에 복사하는 방식으로 재할당을 한다고 한다.

원래 메모리의 용량을 늘리는것이 아닌. 더큰 메모리를 만들어서 그곳에 복사 하고 이전 데이터를 삭제하는 식이다.

이것은  속도상 효율적이지 않다.

그래서 reserve함수를 사용하게 되는데. 이 함수를 사용하면. 메모리 초기값을 잡아놓고 하는것이기 때문에

필요없는 재할당을 최소화 시켜준다.


resize함수는. 내부용량을 딱 정해놓고 사용하는 것이다.

만약에 사이즈를 10으로 해놨을 경우. 무조건 사이즈는 10이된다.

10보다 큰 데이터가 들어오면 끝의 요소들은 버려지게 된다.

내부를 10개보다 적게 채워도 사이즈는 10으로 유지하게 된다.


Posted by JinFluenza