2016년 6월 13일 월요일

UNITY, C# - Coroutine, IEnumerator

나의 경우에는 이미지의 알파값을 떨어뜨리면서 점점 그림이 사라지게 하고 싶어서
1
2
3
4
5
6
7
void Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
    }
}
cs
뭐 이런식으로 업데이트 함수에다 추가 해줬더니 그냥 순식간에 그림이 사라져버렸다.
업데이트는 매 프레임마다 호출하기 때문에 이게 너무 빨리 진행되버리는 것이다.

그래서 코루틴을 사용하면 이걸 어떤프레임에 멈췃다가 다시 시작하는 형식으로 좀더 느리게 실행을 할수가있다.
1
2
3
4
5
6
7
8
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;
    }
}
cs
이런식으로 만들어놓고
1
2
3
4
5
6
void Update() {
    if (Input.GetKeyDown("f")) {
        StartCoroutine("Fade");
    }
}
 
cs
StartCoroutine으로 원하는곳에서 실행을 시켜주면 원하는 결과를 얻을수있다.
유니티에서는 yield 만 있다면 IEnumerator 를 굳이 쓰지않아도 자동으로 인식을
해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Fade() {
    for (var f = 1.0; f >= 0; f -= 0.1) {
        var c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield;
    }
}
 
function Update() {
    if (Input.GetKeyDown("f")) {
        Fade();
    }
}
cs
이런 식으로 쓸수도있다.
만약에 이걸 더 느리게 반복하고 싶다면 waitforseconds를 사용 하면 된다.
1
2
3
4
5
6
7
8
9
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 new WaitForSeconds(.1f);
    }
}
 
cs
이러면 지정한 시간만큼 지연됬다가 다시 시작한다.

UNITY, C# - 베지어 곡선

3차 베지어 곡선 그리기

4차 베지어 곡선 그리기

일단 이렇게 곡선을 그리는 공식인데 이걸 사용해서 부드럽게 곡선을 그릴수있다.

UNITY, C# - Serializable, NonSerializabled

[System.Serializable]
인스펙터창에 변수를 나타내기 위해서 사용된다.
유니티에서 c#스크립트를 만들게되면 기본적으로 MonoBehavior를 상속받아서 public을 쓰면 노출이 되는데 그냥 커스텀 클래스를 만들면 노출이 안된다.
그래서 노출시켜주기 위해서 사용한다.

[System.NonSerializabled]
반대로 인스펙터창에서 안보이게 하기위해서 사용한다.
public 형태를 써야하지만 인스펙터창에 노출시키지 않으려고 할때 사용된다.

2016년 6월 6일 월요일

게임 인공지능 Chap.02 상태구동형 에이전트의 디자인 - West World 프로젝트(BaseGameEntity Class)

이 책에서는 예시로 West World라는 프로젝트를 만들었는데... 기존의 코드를 파해쳐본뒤에 내가 한번 살짝바꿔보도록 하겠다.
일단 Bob, Elsa라는 등장인물이 여러지역을 가서 여러가지의 상태로 전환이 되는것을 표현하고있다.
먼저 BaseGameEntity클래스 라는걸 살펴보면 모든 등장인물들은 여기서 파생이 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class BaseGameEntity
{
private:
  //모든 엔티티들은 고유한 식별번호를 가진다.
  int          m_ID;
  //유효한 다음식별번호이다. BaseGameEntity가 매번 초기화될때마다
  //이 값또한 갱신된다.
  static int  m_iNextValidID;
  //ID가 정확하게 설정되도록 생성자 내부에서 호출된다.
  //ID를 설정하고 유효한 다음ID를 증가시키기 전에
  //메소드에 전달된 값이 유효한 다음 ID보다
//더큰지 아니면 같은지 확인한다.
  void SetID(int val);
public:
  BaseGameEntity(int id)
  {
    SetID(id);
  }
  virtual ~BaseGameEntity(){}
  //모든 엔티티들은 Update를 가지고 있어야한다.
  virtual void  Update()=0;
  int           ID()const{return m_ID;}  
};






cs
각 엔티티들이 고유한 식별자를 가지게 하기 위해서 그래서 초기화 될때 생성자에게 넘겨진 ID가 고유한 것인지를 확인하기 위해서 setID가 검사를 진행한다. 고유한 ID가 아니면 실패 메세지와 함께 프로그램은 종료가 된다.