소켓 통신, 웹 통신(간략 설명, 메모)
■ socket (소켓) 통신
보통 네트워크 게임에서 사용
요청이 없어도 상대에서 알려줄 수 있음
장점
-데이터를 다루는데 있어서 자유로움
-주고 받는게 맘대로 가능
단점
-소켓은 빨대라고 생각. 통신기가 바뀌면 끊김
-빨대의 최대 갯수가 정해져 있음
-웹통신 보다 안정적이지 않음
난이도 웹 통신보다 높음.
메모리에 데이터를 가지고 있을 수 있음.
상호작용 많으면 어쩔 수 없이 소켓 네트워킹을 해야 함.
============================
■ web (웹) 통신
요청을 보내야 반응이 있음
- 비연결 지향. 빨대가 없음. (내부적인 빨대는 있음. 잠깐 연결 후 짜름)
- 최대 연결 갯수가 비교적 여유
- 안정적
메모리에 데이터를 가지기 힘들다.
데이터베이스(DB)에 데이터를 가지고 처리하기에
데이터베이스를 좀 할 줄 알아야 함.
랭킹 서버만 다루면 웹 통신만으로 처리 가능.
모바일 게임에서 많이 다룸.
============================
보통 게임들은 위의 통신 기술들을 복합적으로 사용함.
RPG게임을 예로 들면
아이템을 먹었는데 나중에 보니 없어졌다고 하면
유저들의 신뢰도를 떨어뜨리게 되고 잃게 되는 경우가 큼.
이렇게 신뢰도가 중요한 데이터라고 판단되는 데이터들은 웹 통신으로 처리.
캐릭들간의 실시간 위치 정보는
조금 차이나도 괜찮다고 유저들은 생각하거나 혹은 크게 티가 안나므로
실시간 소켓 통신을 한다고 생각하면 됨.
'공부 > C#' 카테고리의 다른 글
C# 람다 식 (0) | 2016.06.08 |
---|---|
C# Windows Forms - 오목 (0) | 2016.05.31 |
yield return, yield break (0) | 2016.05.24 |
Console 키입력 - Console.ReadKey, ConsoleKeyInfo (0) | 2016.05.12 |
예외처리 - try, catch, finally, throw new Exception (0) | 2016.05.12 |
[잡담]유니티에서 구현하는 2D에 관련하여
요즘 버전의 Unity에서는
프로젝트 만드는 단계에서부터
3D, 2D 프로젝트를 골라서 만들 수 있고
3D로 만들다가 2D로 전환 할 수도 있다.
하지만 유니티에서 구현 하는 2D는 진짜 2D는 아니다.
보통 2D라 하면 평면 이미지가 2차원적으로 움직이는 것이고
축의 개념 자체가 x, y밖에 없는게 보통이다.(Depth(깊이)는 별개)
유니티의 2D 프로젝트는
이미지를 3D에 띄워서 2D처럼 한 평면으로 원근감을 없앨 뿐
x, y, z가 그대로 존재한다.
Collider나 rigidbody가 2D가 별도로 존재 하고
이벤트 함수도 2D용이 별도로 있지만
엄연히 오브젝트들이 3D로 들어 있는 것이다.
2D를 가장한 눈속임용 3D라고 생각해도
아예 틀린건 아니라는 것이다.
유니티에선 직관적으로 이미지들을
바로바로 배치 할 수 있고
테스트나 프로토 타입을 빨리 만들 수 있다는 장점은 확실하나
2D 게임은 복잡한 물리력이 필요한 게임도 많지 않아
저사양의 디바이스까지 생각하고
게임을 만든다면 유니티 엔진 보다는
좀 많이(혹은 엄청 많이) 수고스럽더라도
성능상 디바이스에서 자체 지원하는 언어로
이미지를 띄워 순수 코딩으로 만드는게
낫지 않나라는 생각은 든다.
하지만 이 생각 역시 다른방면으로 돌려 생각하면 무조건이지 않다.
유니티 엔진은 멀티 플렛폼 빌드가 지원되므로
하나에서 만들어 놓으면
다른 플렛폼에서도 거의 그대로 써도 되므로
시간과 인력을 많이 절약 할 수 있으므로
나쁘지 않다고 할 수 있다.
시간과 인력은 즉 돈이고 사업이고 운영인것이다.
이러한 이유로 순수 디바이스 코딩으로 게임이 만들어지는 것은
요즘 세상엔 힘들다는 것이 되겠다.
천재들이 만들어 놓은 엔진을 많이 접해보고
각 게임에 맞는 것을 찾아 쓰도록 하자.
(회사에서 쓰라는 거 쓰면 된다.)
'공부 > Unity' 카테고리의 다른 글
다중 트리거(Trigger) 조작 문제 (0) | 2016.06.01 |
---|---|
splat map (0) | 2016.05.30 |
Ctrl + Shift + f (0) | 2016.05.25 |
InvokeRepeating - 특정 함수 반복 호출, CancelInvoke - 호출 취소 (0) | 2016.05.24 |
Awake(), Start() 의 궁극적 차이 (0) | 2016.05.22 |
Ctrl + Shift + f
Ctrl + Shift + f 는 Hierarchy 의 게임 오브젝트 들의
위치를 Scene에서 바라보고 있는 지점(eye)으로 옮기는 기능이다.
보통 Game뷰에서 바라보는
카메라의 위치를 Scene뷰와 맞추기
바꾸는데 사용한다.
하지만 카메라 뿐만 아니라
조명이든 지형이든 그외 오브젝트 들이든
위치를 Scene뷰의 바라보고 있는 부분으로
조정 할 수 있다는 것을 기억하자.
'공부 > Unity' 카테고리의 다른 글
splat map (0) | 2016.05.30 |
---|---|
[잡담]유니티에서 구현하는 2D에 관련하여 (0) | 2016.05.27 |
InvokeRepeating - 특정 함수 반복 호출, CancelInvoke - 호출 취소 (0) | 2016.05.24 |
Awake(), Start() 의 궁극적 차이 (0) | 2016.05.22 |
Ctrl + Shift + m (MonoBehaviour 이벤트 함수 추가) (0) | 2016.05.22 |
yield return, yield break
C#에 들어와서 첨 보는 구문이다.
지금껏 뭔가 만들 때는 쓸 일이 없었는데
유니티의 코루틴 관련되어서는 쓸일이 많다는 것 같다.
유니티의 코루틴은 나중에 다뤄서 보고
오늘은 C#의 yield가 붙은 구문에 대해서 살펴 보자.
C#에 대한 자세한 사항은 역시 MSDN이다.
아래의 url에 들어가서 한번 씩 살펴 보자
https://msdn.microsoft.com/ko-kr/library/9k7k7cf0.aspx
본인이 머리속으로 정리한 내용은 이러하다.
어떠한 함수 내에서 return 값을 받는 것이 있다고 해보자.
그 return은 반복문 안에 있다.
예를 들면 아래와 같다.
int 함수명()
{
int count = 0;
while(true)
{
count += 1;
return count;
}
}
위의 함수를 호출 해봤자 계속 return값은 1 밖에 안된다.
그렇다면 이제 yield return 을 사용해 보자.
yield 를 쓸때에는 반복기 인터페이스 형식이 필요하다고 나온다.
반복기 인터페이스 형식이란 것은 IEnumerable, IEnumerator 같은 인터페이스를 가르킨다.
private IEnumerable<int> Count()
{
int count = 0;
while (true)
{
count += 1;
yield return count;
}
}
public void Print()
{
foreach (int i in Count())
{
Console.WriteLine(i);
}
}
위와 같은 소스가 정~~~말 간략한 예제이다.
(찾아보면 정말 어렵게 잘쓴 코드들이 있다. 전문적인....)
Print()함수 호출하게 되면 1부터 계속 1씩 증가된 값들이 출력된다.
while (true) 이므로 1,2,3,4,5,6,~,~,~,,,,계속 출력 된다.
어떻게 1이 아니라 값이 증가가 되는 것일까?
yield return 으로 빠져 나온 구문은 현재 그 상태를 기억하고 있다.
말이 좀 애매한데
foreach 에서 계속 반복으로 Count()를 호출하고 변수 i에 넣고
Console.WriteLine(i); 를 끝나고 다시 체크 할때
Count() 의 처음 부터 다시 동작 하는 것이 아니라
yield return 을 했던 자리에서 다시 시작 되는 것이다.
즉 함수가 아예 끝... } 부분까지 도달하지 않는 이상 계속 돌리는 것이다.
위와 같은 예제 소스에서는 While( 조건문 )에 반복을 나올 수 있는 조건을 주거나
while(true){
....
if (count == 8) yield break;
....}
와 같이 yield break; 을 해주면 해당 반복을 모두 마칠 수 있다.
yield return 을 한 문장으로 정리하자면
리턴되는 위치가 저장되어 다시 호출 됐을 때 저장된 위치로부터 재시작이 될수 있다.
라고 생각 해도 되겠다.
그 것을 끝낼 수 있는 것은 yield return 할수 없이 함수 자체가 끝나거나
강제로 yield break; 해주면 된다.
yield 자체로는 위의 정의로 끝나겠지만
이게 간단치 않다.
위의 글중에 나온 인터페이스 들...IEnumerable, IEnumerator
반복기라고 하는데 이들의 차이와 정확한 사용 예...
사용 조건을 정확히 이해 하기는 아직은 힘든 것 같다.
저 인터페이스들을 class가 implement하여 구현해서 사용 할 수도 있고
IEnumerable, IEnumerator마다 구현해야 하는 함수는
각각 다르고 foreach 말고 다른 구문에서 사용하려면 어떻게 해야 하는지 등등
계속 MSDN을 읽어 봐서 이해가 되면 다음 포스팅으로 적도록 하겠다.
'공부 > C#' 카테고리의 다른 글
C# Windows Forms - 오목 (0) | 2016.05.31 |
---|---|
소켓 통신, 웹 통신(간략 설명, 메모) (0) | 2016.05.28 |
Console 키입력 - Console.ReadKey, ConsoleKeyInfo (0) | 2016.05.12 |
예외처리 - try, catch, finally, throw new Exception (0) | 2016.05.12 |
파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines (0) | 2016.05.12 |
InvokeRepeating - 특정 함수 반복 호출, CancelInvoke - 호출 취소
유니티 내에서 특정 함수를 일정 간격으로 계속 실행 시켜줄 수 있는 함수이다.
이런건 참 잘 만들어 놓은 것 같다.
아래와 같이 사용법은 아주 간단하다.
InvokeRepeating("호출할 함수명", 맨처음 호출 할 딜레이 시간, 첫 시간 이후 반복 시간);
만약 위의 함수를 중지 하고자 한다면
CancelInvoke("호출할 함수명");
를 하면 된다.
나중에 추가될 내용이 있으면 더 추가하도록 하겠다.
'공부 > Unity' 카테고리의 다른 글
[잡담]유니티에서 구현하는 2D에 관련하여 (0) | 2016.05.27 |
---|---|
Ctrl + Shift + f (0) | 2016.05.25 |
Awake(), Start() 의 궁극적 차이 (0) | 2016.05.22 |
Ctrl + Shift + m (MonoBehaviour 이벤트 함수 추가) (0) | 2016.05.22 |
정적인 GameObject의 움직임 처리 - Rigidbody 설정 (0) | 2016.05.21 |
Awake(), Start() 의 궁극적 차이
지난 글에 이벤트 함수에 대해 말한 게 있었는데 오늘 공부 하다가 하나 확실히 안게 있다.
http://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html
//스크립트 라이프 사이클 플로우차트(Script Lifecycle Flowchart)
Awake(), Start() 두가지 함 수 모두 보통 맨처음 초기화 해줄 때 사용 해줬는데
본인은 Awake를 자주 사용해서
Awake만 쓰다가 문제가 발생하였었다.
폭탄을 포물선으로 날리기 위해
폭탄을 prefab(자식에 리지드바디가 있는 Sphere가 있음)으로 만들고
Player가 스크립트에서
GameObject.Instantiate()을 이용하여
폭탄을 동적 생성을 하게 만들었다.
그리고 폭탄의 방향을 주기 위해
GameObject bomb = GameObject.Instantiate(bombTemp, this.transform.position, Quaternion.identity) as GameObject;
bomb.transform.rotation = this.transform.rotation;
위와 같이 자신의 방향을 넘겨 주었는데
이부분에서 문제가 있었다.
폭탄 prefab의 자식 ball에 script가 있는데
맨처음에는
public void Awake()
{
enemyMask = LayerMask.GetMask("Shootable");
floorMask = LayerMask.GetMask("Floor");
start = false;
explosion = false;
bombRigidBody = transform.GetComponent<Rigidbody>();
Vector3 startPosition = transform.forward * 0.7f + transform.up * 0.3f;
bombRigidBody.AddForce(startPosition * 500.0f);
}
위 스크립트와 같이 초기화해줄 변수는 초기화 해주고
방향을 가지고 와 힘을 줬는데
방향에서 계속 초기 값이 들어가는 것이었다.
그래서 이것 저것 테스트 해보니
Player에 있는 bomb.transform.rotation = this.transform.rotation; 부분보다
생성된 Bomb의 Awake()가 먼저 실행된다는 것을 알았다.
그럼 어떻게 하였느냐?
public void Awake()
{
enemyMask = LayerMask.GetMask("Shootable");
floorMask = LayerMask.GetMask("Floor");
start = false;
explosion = false;
}
public void Start()
{
bombRigidBody = transform.GetComponent<Rigidbody>();
Vector3 startPosition = transform.forward * 0.7f + transform.up * 0.3f;
bombRigidBody.AddForce(startPosition * 500.0f);
}
위의 script와 같이
본인만 사용할 뿐인 변수들의 초기화는 Awake() 에
다른 곳에서 값 설정 한 후
컨트롤 하기 위한 초기화는 Start()에 하는 것이
의도한대로 동작 할 방법이었다.
Awake()는 생성 하자마다 들어가는 함수이고
Start()는 Awake() 후에 Update() 전에 동작 하는 이벤트 함수임을 기억하자.
(맨위의 url로 들어가서 다시 한번 이벤트 사이클에 주목하자.)
'공부 > Unity' 카테고리의 다른 글
Ctrl + Shift + f (0) | 2016.05.25 |
---|---|
InvokeRepeating - 특정 함수 반복 호출, CancelInvoke - 호출 취소 (0) | 2016.05.24 |
Ctrl + Shift + m (MonoBehaviour 이벤트 함수 추가) (0) | 2016.05.22 |
정적인 GameObject의 움직임 처리 - Rigidbody 설정 (0) | 2016.05.21 |
GameObject 삭제, 활성, 비활성화 (0) | 2016.05.20 |
Ctrl + Shift + m (MonoBehaviour 이벤트 함수 추가)
Awake(), Start(), FixedUpdate(), LateUpdate(), OnCollisionStay(Collision collision), OnCollisionEnter(Collision collision), OnMouseDown(), OnMouseDrag(), OnTriggerEnter(Collider other), OnTriggerStay(Collider other), Reset(), ...
....등등
스크립트에서 유니티 워크플로우(WorkFlow)에 따른 이벤트 함수들을 가져다가 쓸 수 있다.
유니티에서 만든 스크립트들은 기본적으로 MonoBehaviour 를 상속 받아 쓰기 때문이다.
이벤트 함수들의 순서는 아래 공식홈페이지를 참조 하기 바란다.
http://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html
//스크립트 라이프 사이클 플로우차트(Script Lifecycle Flowchart)
위의 함수들을 직접 치다가 오타가 발생하면
본인이 원하는 타이밍에 함수가 실행이 되지 않아
에러는 안나는데 적용이 안되는 등 원인을 찾기 힘들어 질 수 있다.
그래서 보통 위의 함수들은 찾아서 쓰는 것이 좋다.
Visual Studio 2015 기준
상단 메뉴 Tools > Extensions and Updates... 에서
Visual Studio 2015 Tools for Unity 가 설치 되어있다면
키보드 Ctrl + Shift + m 을 누르면
위와 같은 창이 뜨고
원하는 함수를 찾아서 클릭 후 OK누르면 오타 없이 추가된다.
이미 추가한 함수들은 빠져 있다.
'공부 > Unity' 카테고리의 다른 글
InvokeRepeating - 특정 함수 반복 호출, CancelInvoke - 호출 취소 (0) | 2016.05.24 |
---|---|
Awake(), Start() 의 궁극적 차이 (0) | 2016.05.22 |
정적인 GameObject의 움직임 처리 - Rigidbody 설정 (0) | 2016.05.21 |
GameObject 삭제, 활성, 비활성화 (0) | 2016.05.20 |
[잡담]유니티를 일주일정도 공부 하면서 드는 생각 (0) | 2016.05.19 |
정적인 GameObject의 움직임 처리 - Rigidbody 설정
Collier 가 있는 GameObject 가
리지드바디(Rigidbody) 가 없으면
움직이지 않을 정적 오브젝트로 취급이 된다.
유니티(Unity)에서는 정적오브젝트들을 모두 찾아
캐시에 저장하여 처리한다.
하지만 이런 정적인 오브젝트가
transform(Position, Totation, Scale)에 변화가 생기게 되면
유니티엔진은 다시 정적인 오브젝트들을 찾는 연산을 하게 된다.
만약 하나의 Cube 오브젝트를 생성하고
이 오브젝트를 계속 돌려 배경으로 삼는 다면
매 Frame 마다 정적오브젝트를 찾는 연산을 하므로
최적화된 게임을 만들수 없게 된다.
그렇다면 어떻게 해야 할까?
리지드바디(Rigidbody) 컴포넌트를
해당 GameObject에 추가해서 컨트롤 하면
정적인 오브젝트 취급을 받지 않게 된다.
Add Component 로 Rigidbody를 그냥 추가하게 되면
기본적으로 중력을 받게 설정되어 있으므로
문제가 될 수 있다.
그렇다고 Use Gravity 만 체크 해제 하면 될까?
아니다.
Rigidbody 는 물리력으로 움직이기 때문에
어떠한 다른 문제가 생길 지 모른다.
그리하여 그 아래에 is Kinematic 을 체크 해주는 것을 권장한다.
Kinematic 이 체크된 객체들은 모든 물리력에 반응 하지 않게되고
스크립트에서 transform을 이용하여 움직여도
정적 오브젝트에 의한 재검사가 일어나지 않아 문제가 되지 않는다.
보통 오브젝트 안에 다른 오브젝트가 들어가거나
얹게 되거나
트리거로 된 오브젝트, 고정된 배경 등등
Collider가 있지만 물리력 적용을
안시킬 객체들에 유용하게 쓰인다.
'공부 > Unity' 카테고리의 다른 글
Awake(), Start() 의 궁극적 차이 (0) | 2016.05.22 |
---|---|
Ctrl + Shift + m (MonoBehaviour 이벤트 함수 추가) (0) | 2016.05.22 |
GameObject 삭제, 활성, 비활성화 (0) | 2016.05.20 |
[잡담]유니티를 일주일정도 공부 하면서 드는 생각 (0) | 2016.05.19 |
태그(tag)로 찾기, 비교하기 (0) | 2016.05.19 |
GameObject 삭제, 활성, 비활성화
유니티 하이어라키에 있는 오브젝트 들을
스크립트에서 삭제 할 수 있다.
Destroy(gameObject);
GameObject 형의 변수를 넣으면 해당 오브젝트는
삭제된다.
Destroy(gameObject, 3.0f);
이런식으로 뒤에 float 숫자를 넣게 되면
그만큼 시간이 지나고 삭제가 된다.
1.0f 당 1초 이다.
하지만 아예 없애는 것보다
활성, 비활성을 컨트롤 하여
리소스 소모를 줄이는 것을 권장한다.
gameObject.SetActive(false); //비활성
gameObject.SetActive(true); //활성
비활성화된 오브젝트는 게임 상에서 안보이게 된다.
비활성화 시킨 오브젝트를
활성 시키면 게임상에서 다시 보인다.
'공부 > Unity' 카테고리의 다른 글
Ctrl + Shift + m (MonoBehaviour 이벤트 함수 추가) (0) | 2016.05.22 |
---|---|
정적인 GameObject의 움직임 처리 - Rigidbody 설정 (0) | 2016.05.21 |
[잡담]유니티를 일주일정도 공부 하면서 드는 생각 (0) | 2016.05.19 |
태그(tag)로 찾기, 비교하기 (0) | 2016.05.19 |
유니티 프로젝트 폴더 백업 방법 (1) | 2016.05.13 |
[잡담]유니티를 일주일정도 공부 하면서 드는 생각
이제 1주일 정도 유니티를 공부하였다.
처음에는 이미지나 3D오브젝트 들을
쉽게 다룰수 있어서 재밌었는데
지금은 마냥 쉽다거나 재밌다거나 생각만 드는 것은 아니다.
좀 부정적인 생각도 드는게
유니티가 C# Base로 되어있다고 했었나...
객체를 동적 할당으로 만들었으면 나중에 사용하지 않을 때
지워주지 않는 이상 메모리를 차지 하고 있잖아??
그렇다면 유니티로 생성하고 지우지 않은 것은 언제 지워주는 걸까?
사용하지 않고 있지 않은 것은 어떻게 되는 거지?
가비지 컬렉터에 무조건 의존하고 있나?Destroy() 함수를 사용하면 해결 되나?
꽤 깊숙히 내부를 아는 건 아니니까 불안요소인것 같다.
천재들이 만든다는 엔진이니 어련히 잘 했을까 하지만
메모리 처리에 대해서는 c++이 더 나았던거 같고
그런 면에서 c++이 Base인 언리얼 엔진이 더 좋지 않나 싶다.
(어짜피 나중에 기회되면 언리얼도 공부 할 것이다.)
유니티의 물리엔진에 대해서는 대체적으로 다 고맙지만
내가 짜면 더 빠르게 완성하거나
쉽게 할 것 같은 기능도
유니티에서 구현을 해놓아도
옵션 버튼이나 뭘 사용하고 뭘 클릭할지 모르면
할 수 없다는 건 좀 불편 한 것 같다.
기능을 많이 안다고
공부를 많이 한 것 같은 기분도 안든다.
이제 겨우 찾았다는 느낌?
유니티 홈페이지와 친해지는 기분?
그래도 다시 말하지만 물리엔진은 진짜 좋다.
.
.
.
음...
이건 유니티 자체에 대한 문제는 아니고
전혀 다른 방향성의 또 다른 문제인데
만드는 게 누구에게나 쉽다라는게 장점인가?
- 프로그램으로서 그건 장점이다.
하지만 3D에 대한 개념을 잘 모르는 사람도
게임을 양산 할 수 있다는 것은
보기좋은 개살구만 늘어나는 것이 아닌가 싶은 것도 있다.
게임 적으로도 인적자원으로서도...
이런 생각을 한다고 본인이 그렇게 실력자는 아니지만
왠지 회사 입장에서 생각을 해보면
유니티를 좀 다룰줄 아는 신입은
쓰다가 버리고 다른 사람 뽑기 좋은
그냥 소모품으로써 사용되기 좋지 않나 싶다.
DirectX를 안배우고 3D개념을 아예 안모르고
Unity먼저 배우고 뛰어드는 사람도 꽤 있다고 생각된다.
그 사람들은 나중에 벽에 부딪힐지도 모른다.
이론, 원리, 개념...
기초와 기본 토대 없이 세워진 건물은 작은 지진에도 쉽게 무너진다.
Unity는 좋은 살이 될 수 있다.
그렇지만 남들이 봤을 때 살안에 뼈대가 있는지 없는지는
찔러보기 전까지는 모르는게 문제가 될 것 같다.
누가 나를 찔러 봤을 때 "이 사람 통뼈다"라고 생각을 할 수 있을 만큼
공부에 더 열을 올려야 겠다.
'공부 > Unity' 카테고리의 다른 글
정적인 GameObject의 움직임 처리 - Rigidbody 설정 (0) | 2016.05.21 |
---|---|
GameObject 삭제, 활성, 비활성화 (0) | 2016.05.20 |
태그(tag)로 찾기, 비교하기 (0) | 2016.05.19 |
유니티 프로젝트 폴더 백업 방법 (1) | 2016.05.13 |
[잡담]유니티 첫 공부 소감 (0) | 2016.05.12 |