2016년 5월 29일 일요일

UNITY - PlayerPrefs

점수를 저장하거나 스테이지를 저장하거나 하였다가 하는 그런 경우에 유용하게 쓰일수가 있다.

PlayerPref.Set자료형("문자열 키값", 저장할 값);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using UnityEngine;
using System.Collections;
 
public class csTest : MonoBehaviour {
    int currentScore; 
    int highScore; 
 
    string currentPlayerName; 
    string highScorePlayerName; 
 
    void SaveData(){
// 현재 점수를 저장
        PlayerPrefs.SetInt("Score", currentScore); 
// 최고점에 현재점수를 저장
        PlayerPrefs.SetInt("HighScore", currentScore); 
// 현재 이름을 저장
        PlayerPrefs.SetString("HighScoreName", currentPlayerName); 
    }
 
    void GetData(){
// 최고점은 highscore란에 저장된 현재의 점수를 가져온다
        highScore = PlayerPrefs.GetInt("HighScore"); 
// 저장된 현재 이름을 가져온다
        highScorePlayerName = PlayerPrefs.GetString(
"HighScoreName""N/A"); 
    }
}
cs
이런식으로 저장해 뒀다가 나중에 원하는 때에 불러올수가 있다.
SetInt
key에의해 식별되는 환경의 값을 설정합니다.
GetInt
만약 그것이 존재한다면 환경설정 파일에서 key에 해당하는 값을 반환합니다.
SetFloat
key에의해 식별되는 환경의 값을 설정합니다.
GetFloat
만약 그것이 존재한다면 환경설정 파일에서 key에 해당하는 값을 반환합니다.
SetString
key에의해 식별되는 환경의 값을 설정합니다.
GetString
만약 그것이 존재한다면 환경설정 파일에서 key에 해당하는 값을 반환합니다.
HasKey
만약 환경설정에서 key가 존재한다면 true를 반환합니다.
DeleteKey
환경설정으로부터 그것의 값에 해당하고 key를 제거합니다.
DeleteAll
환경설정으로부터 모든 키와 값을 제거합니다. 조심해서 사용하세요.
이렇게 다양한 옵션들이 있다.

UNITY, C# - lerp

레퍼런스에서 검색해보면 
두 선형 벡터(from, to) 사이의 시간에 따른 위치를 구할 때 사용됩니다. 라고 나와 있는데 
transform.position = Vector3.Lerp(시작위치, 끝위치, 시간); 요론 구조로 되어있다.
이걸 선형 보간이라는 방법을 사용하는데 쉽게 풀어서 설명하면
시작점과 끝점 사이에 있는 점들에 대해서 시간의 변화에 따라서 해당 점들을 예측하는 것을 말한다.
이 시간값을 이용해서 점점 느려지게 할수도 있고 일정하게 가도록 할수도 있다.
1
2
3
4
5
6

void Update(){
    transform.position = Vector3.Lerp(transform.position,
                                      destination.position,
                                      speed * Time.deltaTime);
}
cs
이 경우에는 시작위치가 현재위치로 계속 바뀌지만 시간의 비율만큼 움직이는 것이기때문에 
위치가 계속 바뀔지언정 목적지에는 도달할수가 없다.

이게 유용한 이유는 물체의 위치를 이동하는데 쓸수도있지만 color, rotation값등등 다양한 곳에 쓸수가 있다.
1
2
3
4
5
6
7
8
9
void Update (){
    spriteRenderer.color = Color.Lerp(spriteRenderer.color,
                                      destinationColor,
                                      speed * Time.deltaTime);
 
    transform.rotation = Quaternion.Lerp(transform.rotation,
                                         destinationRotation,
                                         speed * Time.deltaTime);
}
cs
이런식으로 다양한 곳에 활용할수가 있다.

2016년 5월 27일 금요일

UNITY, C# - Tostring

tostring 말그대로 문자열로 변환을 시켜주는 것이다.
int num;
num.ToString();
그냥 ToString만 써주면 그냥 그 값을 그대로 가져오는 것이고 여러가지 옵션을 주어서 다르게 가져올수도 있다.

ToString("C") 통화표시(돈표시), 해당 컴퓨터에서 사용하는 통화 단위로 변환ToString("D")  정수의 10진수 표시
ToString("E")  부동 소숫점의 지수 표시
ToString("F")  표준의 부동 소숫점 표시
ToString("G")  E또는 F의 단축 표시
ToString("N")  자리로 구분된 붇종 소숫점 표시
ToString("P")  퍼센트 표시
ToString("X")  정수 16진수 표시
ToString("x5") 5자리로 표시 -> 00001
ToString("0000") 4자리로 표시 -> 0001 
ToString("0000.00") 소수점2자리까지 -> 0001.00 
"f3" : 소수점 아래로 세 자리까지 표시
"0" : 정수 현태로 변환
"0%" : 정수 퍼센트 단위로 변환
"n" : 천 단위마다 쉼표를 집어넣음
Color.ToString
Rect.ToString

이런식으로 여러방법으로 사용이 가능하다.

캡스톤 디자인 프로젝트 UI제작 - 2(Score)

점수를 구현해보자. 점프하는 게임이기 때문에 높이를 표시해주고 싶어서 처음에는
1
2
3
4
5
6
    void Update () {
        score = gamePlayer.transform.position.y;
        //소수점부분은 제외하고 정수부분만 표시가 되게
        string temp = score.ToString ("N0");
        GetComponent<Text> ().text = temp + "M";
    }
cs
이런식으로 그냥 player의 position값만 가져와서 그대로 표시 해줬는데 이렇게 하니까 문제가 player가 떨어지면 score도 같이 떨어져서 score값이 늘었다가 줄었다가 하는것이다.

그래서 score값을 처음에 0으로 주고 position값이 score값보다 클때만 position값을 가져오
는 식으로 바꿔 주었다.
1
2
3
4
5
6
7
void Update () {
        if (gamePlayer.transform.position.y >= score) {
            score = gamePlayer.transform.position.y;
        }
        string temp = score.ToString ("N0");
        GetComponent<Text> ().text = temp + "M";
    }
cs
이런식으로 그래서 이제 올라갈때만 점수가 올라가고 내려갈때는 깎이지 않게 해주었다.

2016년 5월 22일 일요일

환상체(toroid)

사전에 검색해보니까 자기장이 어쩌구 머라머라 나오는데 
3차원이라면 도넛 모양이라고 알고있으면 될꺼같다.

게임 인공지능 Chap.03 자동적으로 움직이는 게임 에이전트 생성법 - 1

자동적 에이전트란??

자신만의 예정된 일을 추구하면서 자신의 환경을 감지하고, 시간에 따라 그러한 환경에 작용하며, 그래서 미래에 감지할 것에 영향을 미치는, 그러한 환경 안에 또는 그 일부분으로 위치하고 있는 시스템을 말한다.

이러한 시스템으로 움직이는 에이전트는 다음과 같은 계층 구조를 가진다.
액션, 선택조종(steering), 이동력(locomotion) 이러한 속성을 띤 움직임을 가지는데 
책에서는 이런 다양한 타입의 행동을 하는 기본적인 운반기의 모델을 제시하고있다.

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
class MovingEntity : public BaseGameEntity{
protected:
  
  Vector2D    m_vVelocity;
  
  //개체가 향하는 방향을 가르키는 정규화된 벡터
  Vector2D    m_vHeading;
  //방향 벡터에 대해서 수직인 벡터
  Vector2D    m_vSide; 
  double       m_dMass;
  
  //개체의 최대 속도
  double       m_dMaxSpeed;
  //개체가 자신을 움직이기위해서 낼수있는 최대의 힘
  //로켓의 추진력이라고 생각하자
  double        m_dMaxForce;
  
  //가능한 최대 회전비율 (rad / s)        
  double       m_dMaxTurnRate;
// 나머지 생략
}
cs
이러한 속성값들을 가지고 있다.

이제 객체가 다양한 조종 행동에 접근할 수 있도록 하는 Vehicle클래스를 보자
1
2
3
4
5
6
7
8
9
10
11
12
class Vehicle : public MovingEntity{
private:
  //운반기가 통로, 벽, 에이전트 데이터에 접근할수있게 해주는
  //월드데이터를 가리키는 포인터
  GameWorld*            m_pWorld;
  //조종 행동들의 클래스
  SteeringBehavior*     m_pSteering;
// 생략
}
cs
이런식으로 자기의 조종행동 클래스에 접근할 수있게 해준다.

이걸 UML 도표로 보면
이런 그림이 나온다, 그림을 간단히 요약을 하면
Vehicle이 나머지 것을에서 정보를 받아와서 GameWorld에서 구현이 된다.
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
32
33
34
35
36
37
void Vehicle::Update(double time_elapsed)
{    
  //시간의 경과
  m_dTimeElapsed = time_elapsed;
 
  //옛날 위치를 기록해뒀다가 나중에 업데이트 할수있다.
  Vector2D OldPos = Pos();
 
  Vector2D SteeringForce;
 
  //운반기 리스트에 있는 각각의 조종행동 으로부터 조합된 힘을 계산
  SteeringForce = m_pSteering->Calculate();
    
  //가속도 = 힘/질량
  Vector2D acceleration = SteeringForce / m_dMass;
 
  //속도를 갱신한다.
  m_vVelocity += acceleration * time_elapsed; 
 
  //운반기가 최대속도를 안넘도록 한다.
  m_vVelocity.Truncate(m_dMaxSpeed);
 
  //위치를 갱신한다.
  m_vPos += m_vVelocity * time_elapsed;
 
  //매 단계마다 지역좌표계가 갱신이 되어야 하는데 
  //운반기의 방향은 항상 자신의 속도에 따라서 정렬한다.    
  //운반기의 속도가 보기값보다 크다면 방향을 갱신한다.
  if (m_vVelocity.LengthSq() > 0.00000001)
  {    
    m_vHeading = Vec2DNormalize(m_vVelocity);
 
    m_vSide = m_vHeading.Perp();
  }
  //스크린을 환상체(toroid)로 간주한다.
  WrapAround(m_vPos, m_pWorld->cxClient(), m_pWorld->cyClient());
 
cs
운반기의 여러가지 물리적 역할을 갱신해준다(가속도, 방향, 위치확인)






UML 다이어그램

UML이란?

UML이라는 것은 시스템에 존재하는 클래스, 클래스 안의 필드, 메소드, 서로 협력하거나 상속하는 클래스 사이의 연결 관계를 나타내 는 그림이라고 정의가 되어있는데, 간단하게 말해서 모델을 만드는 언어이다.
그림으로 그려서 만들어 놓으면 딱히 코드가 없거나 모르는 사람과도 소통하기가 쉽고
서로 간의 의견교환에도 용이하다.

배우는책에 잇는걸로 예를 들어서 이해를 해보자

SteeringBehaviors에서 각 요소들을 조금 해석해보면
대강 이런식으로 해석이 될수가 있다.

1. 상단 : 클래스명
2. 하단 : 매서드
   -, Private : 외부에 노출이 되지 않는 한정자
   +, Public : 외부에 노출이 되는 한정자
   #, Protected : 클래스나 상속된 클래스에서 접근가능한 한정자



3가지 부분으로 되있는 것도 있는데

1. 상단 : 클래스명
2. 중단 : 데이터(멤버변수)
3. 하단 : 행동양식(매서드)

그 다음 클래스 간의 관계를 살펴보면
1. Generalization (일반화)
쉽게 말해서 상속관계를 나타내는 것이다.
위의 그림에서 보면 Vehicle -> MovingEntity -> BaseGameEntity 이렇게 상속이 된다.

2. Realization (실체화)
명제, 정의만 있는 메서드를 오버라이딩하여 실제 기능으로 구현하는것이다.

3. Dependency (의존)
어떤 클래스가 다른 클래스를 참조하는것이다.
위의 그림에서 보면 SteeringBehaviors에 있는 내용들이 GameWorld에서 참조된다.

4. Association (연관), Directed Association (직접연관)
보통 다른 객체의 참조를 가지는 필드를 의미합니다.
직접연관은 화살표를 이용해서 가리키는 쪽으로 참조를 하는것을 의미하고, 그냥 연관은 화살표로 명시를 해주지 않았으므로 한쪽으로 또는 양쪽모두다 참조할수 있다는 것을 의미한다.

5. Aggregation (집합, 집합연관)
전체와 부분의 관계를 나타냅니다. Association과 비슷하지만 집합이라는 의미도 가지고 있으므로 좀더 넓은 의미를 가진다고 볼수있다.

6. Composition (합성, 복합연관)
Aggregation 보다 강한 집합이라고 할수있다. 부분이 전체에 종속적이고, 전체의 소유이다.
위의 그림에서는 SteeringBehaviors, Vehicle, GameWorld순으로 종속관계에 있다.





2016년 5월 20일 금요일

캡스톤 디자인 프로젝트 UI제작 - 1(Panel, Button)

Panel, Timescale, Public void


이번 프로젝트에서는 내가 총괄과 UI를 맡았는데 오늘은 PAUSE버튼을 한번 만들어보도록 하자.

유니티에 있는 패널기능을 이용하여서 한번 만들어 보도록하자.

하이어라키탭에 Create를 눌러보면 UI-Panel을 눌러서 생성을 할수있다.
이런식으로 간단하게 구성을 해보았다.

그래서 이제 함수를 만들어보려고 했는데 스크립트를 만들려고 했는데 유니티에 간단한 함수는 구현이 되어있어서 붙이기만 하면 되게 해놨더라.
이런식으로 오브젝트를 골라서 붙여넣어 주기만 하면 간단한 함수는 구현이 가능하다.
panel을 보였다 안보였다 하는것은 만들었고 이제 게임도 같이 일시정지가 되게 하여야 하는데 

Timescale값을 조정하여서 게임을 일시정지 시켜보도록 하자 Timescale은 실제 시간에 대한 게임시간이라고 나와있는데 이 말인 즉슨

값이 1이라면 그대로 변화가없고 0.5면 2배 느리게 가고 2면 2배빠르게가고 0이면 아예 시간이 멈춘다는 것이다. 

그래서 이걸 이용해서 버튼을 누르면 Timescale이 0이 되도록하여서 게임을 정지 시켜보자

Script에서 public void를 이용하여서 선언을 하면 On Click에서 내가 쓴 함수를 사용할수있다.
이런식으로 버튼마다 Timescale을 조정하여서 게임을 일시정지 시켯다가 해제 할수있게 만들었다.

pause버튼을 누르면 패널이 나오면서 게임이 멈추고 resume버튼을 누르면 패널이 없어지면서 다시 게임이 된다.