레이블이 Unity인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Unity인 게시물을 표시합니다. 모든 게시물 표시

2017년 12월 22일 금요일

Unity - 강좌





http://blog.naver.com/PostView.nhn?blogId=gold_metal&logNo=220882800191&parentCategoryNo=&categoryNo=40&viewDate=&isShowPopularPosts=true&from=search


http://prosto.tistory.com/130


https://astoration.gitbooks.io/sihs-shootinggame/content/


https://www.youtube.com/playlist?list=PLI69hfdYKNQcv9caOXl4CVHRw8lsY1I19


https://totuworld.gitbooks.io/unity_ngui/content/prototype/README.html


http://itmining.tistory.com/25


http://www.unity3dstudy.com/


http://blog.naver.com/PostView.nhn?blogId=gold_metal&logNo=220460915704&parentCategoryNo=&categoryNo=40&viewDate=&isShowPopularPosts=true&from=search





https://sites.google.com/site/ub8566/test/runninggame/run001

https://sites.google.com/site/unity3dstudy/home/unity3d-curriculum/2015/--1/source---csbackgroundcs



http://blog.naver.com/PostListByTagName.nhn?utf8=true&blogId=progagmer&logType=0&cpage=28&tagName=%EC%9C%A0%EB%8B%88%ED%8B%B0



[바닦 여러개 반복 생성]

http://hyunity3d.tistory.com/419?category=530254




[동영상]


https://www.youtube.com/watch?v=XY8mVME9Qok


https://www.youtube.com/watch?v=zc8ac_qUXQY

https://www.youtube.com/watch?v=fHN-26GEVhA



[배경 이미지 무한 스크롤]

세로 : http://blog.daum.net/kij43000/3



[슈팅 게임 만들기]


https://astoration.gitbooks.io/sihs-shootinggame/content/1c77c_cc28_-_c2a4_d06c_b864_b418_b294_bc30_acbd_b9.html



[광고 설치]

http://samablog.tistory.com/119?category=365346



[50 Tips for Working with Unity Best Practices]

http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/

http://seungngil.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%9E%91%EC%97%85%EC%97%90-%EB%8C%80%ED%95%9C-50-%ED%8C%81-%EB%AA%A8%EB%B2%94-%EC%82%AC%EB%A1%80-50-Tips-for-Working-with-Unity-Best-Practices









Unity - 카페




유니티 공유 카페

http://cafe.naver.com/unityhub






Unity - assetstore





https://www.assetstore.unity3d.com



[눈]

https://www.assetstore.unity3d.com/kr/#!/content/62038

https://www.assetstore.unity3d.com/kr/#!/content/19248



Unity - Scripting - C# - Delegate, Event



[Unity] Delegate 와 Event 설명 모음



Unity 터치이벤트 처리하기
http://www.bsidesoft.com/?p=164

C# delegate, action, event 활용 관련
http://hyunity3d.tistory.com/522

Unity event delegate 예제
http://hyunity3d.tistory.com/528

C# delegate과 event의 차이점
http://www.gpgstudy.com/forum/viewtopic.php?topic=18988

Delegate( 델리게이트 ) 는 어떨때 쓰나요?
http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=36068

C# 강좌 19편. 델리게이트와 이벤트
http://blog.eairship.kr/151

Unity EventHandler를 이용해서 Event Driven Programming 하기
http://growingdever.tistory.com/215

C# 5장. 델리게이트 (Delegate) - 콜백, 체인
http://mrw0119.tistory.com/19

C# 7장. 이벤트 (Event)
http://mrw0119.tistory.com/21

C# event (이벤트) 를 알아보겠습니다.
http://aloloever.blogspot.kr/2015/01/c-event.html

Unity 탄막 슈팅 게임을 만들자(2), 이벤트(Event)와 Delegate 의 사용
http://linecode.tistory.com/12

Unity Event, UnityAction and Delegate
http://rapapa.net/?p=2936

대리자(delegate)
http://penji.tistory.com/160

C# 기초문법 델리게이트, 이벤트
http://blog.daum.net/_blog/BlogTypeView.do?blogid=0rMHK&articleno=104&categoryId=9&regdt=20151227150851

C# delegate 쉽게 이해하기
http://www.csharpstudy.com/CSharp/CSharp-delegate-concept.aspx

c# lambda expression
http://www.csharpstudy.com/CSharp/CSharp-lambda.aspx




Unity - Scripting - C# - Animation




---------------------------------------------------------------

스크립트상에서 애니메이션을 전환하려면 다음과 같은 소스를 작성해야합니다.

Animation 컴포넌트를 구한다.
Animation.CrossFade 메서드를 호출한다.


Animation animation = GetComponent<Animation>();
animation.CrossFade("애니메이션 이름");

---------------------------------------------------------------


애니메이션 스크립팅 Animation Scripting


유니티의 애니메이션 시스템은 멋지게 애니메이션이 적용된 스키닝이 된 캐릭터를 만드는 것을 가능하게 해줍니다. 애니메이션 시스템은 애니메이션 블렌딩 blending, 믹싱 mixing, 가산 additive 애니메이션, 걷기사이클 시간동기화 walk cycle time synchronization, 애니메이션 레이어, 애니메이션 재생에 관한 모든 면에서의 제어 (시간, 속도, 블렌드 웨이트 blend-weights), 버텍스 당 1, 2, 혹은 4개 본 bone 들의 메쉬 스키닝뿐만 아니라 물리 기반의 랙돌 ragdoll 과 절차적 애니메이션 procedural animation 도 지원합니다. 가장 만족스런 결과를 얻기 위해서는 Modeling Optimized Characters 페이지의 유니티에서 최적의 성능을 내는 리깅된 캐릭터 생성을 위한 가장 좋은 방법들과 기법들에 대해 읽어 보시는 것을 추천해 드립니다.
애니메이션 캐릭터를 만드는 것은 두 가지와 관련이 있습니다: 세상에서 그들이 움직이게 만들고 그에 따라 캐릭터가 애니메이션을 하게 만드는 것 입니다. 캐릭터를 움직이는 것에 대해 더 알고 싶으시다면 다음 Character Controller page를 참조하세요. 이 페이지는 애니메이션에 촛점을 맞추고 있습니다. 실제 캐릭터들의 애니메이션 적용은 유니티의 스크립팅 인터페이스를 통해 이루어 집니다.
여기에서 미리 셋업이 된 애니메이션 적용 캐릭터가 있는 example demos를 다운로드 받으세요. 이 페이지에서 기본을 익히면 animation script interface도 보시기 바랍니다.

원하신다면 이 페이지에서 다루는 아래의 주제들을 탐구해 보세요:


애니메이션 블렌딩 Animation Blending


오늘날의 게임에서 애니메이션 블렌딩 blending 은 캐릭터의 부드러운 애니메이션을 위해서 필수적인 요소입니다. 애니메이션을 만드는 사람은 각각의 애니메이션을 만듭니다. 예를 들어, 걷고, 뛰고, 쉴 때 idle 동작, 또는 사격하는 애니메이션이 있습니다. 게임 중에서는 어떤 때라도 가만히 있는 idle 애니메이션에서 걷는 애니메이션 또는 반대로 바꿀 수가 있어야 합니다. 물론 사용자는 움직임이 갑작스레 튀지 않고 부드럽게 전환되는 애니메이션을 원할 것입니다.
이때 필요한 것이 바로 애니메이션 블렌딩입니다. 유니티에서는 하나의 같은 캐릭터에 어떤 수의 애니메이션도 넣을 수가 있습니다. 모든 애니메이션들은 최종 애니메이션을 만들기 위해 서로 섞여지거나 더해집니다.
사용자가 할 첫 스텝은 캐릭터를 가만히 쉬는 애니메이션에서 걷는 애니메이션으로 부드럽게 전환하는 것입니다. 스크립트 작성시 작업을 쉽게 하기위해 애니메이션의 랩 모드 Wrap Mode를 반복 Loop으로 설정합니다. 그리고 사용자가 만드는 스크립트가 애니메이션이 재생되는 유일한 것이 되게 자동으로 재생되게 Play Automatically 를 꺼놓습니다.
캐릭터를 동작시키기 위한 첫 스크립트는 꽤 간단한 편입니다. 사용자가 알아야 할 것은 단지 캐릭터가 얼마나 빨리 움직이는지 감지할 방법과 걷는 애니메이션과 쉬는 애니메이션 사이에 녹아들어 사라지게 합니다. 이 간단한 테스트를 위해서 미리 설정된 입력 축들 input axes 을 사용합니다.

function Update () {
   if (Input.GetAxis("Vertical") > 0.2)
       animation.CrossFade ("walk");
   else
      animation.CrossFade ("idle");
} 

이 스크립트를 실행하기 위해서는:
  1. Assets→Create Other→Javascript를 이용해 자바 스크립트 Javascript 를 만듭니다.
  2. 그 안에 코드를 복사 & 붙여넣기를 합니다
  3. 스크립트를 캐릭터로 드래그하세요 (그것은 애니메이션과 같은 게임 오브젝트여야 합니다)
사용자가 재생 Play 버튼을 누르고, 위방향키를 누르고 있으면 캐릭터가 걷기 시작하고 손가락을 떼면 쉬는 포즈로 돌아갈 것입니다.


애니메이션 레이어 Animation Layer


레이어는 사용자가 애니메이션을 그룹화하고 가중치 weighting 에 우선 순위를 매기는 것을 가능하게 해주는 굉장히 중요한 개념입니다.
유니티 애니메이션 시스템에서 사용자는 원하는 만큼 애니메이션 클립들을 서로 블렌드 할수 있습니다. 사용자는 수동으로 가중치를 주거나 간단히 자동으로 가중치를 주는 animation.CrossFade()를 이용할 수 있습니다.

블렌드 가중치는 적용되기 전에 항상 정규화됩니다 Blend weights are always normalized before being applied.


걷는 것과 뛰는 애니메이션이 있고 둘 모두 1 (100%) 의 가중치를 가진다고 가정해 보세요. 유니티가 최종 애니메이션을 생성할 때 가중치를 정규화 합니다. 즉 걷는 것과 뛰는 애니메이션이 50%씩의 가중치를 각각 부여하게 되는 것입니다.
하지만 대부분의 경우 사용자는 두 개의 애니메이션이 있을 때 어떤 애니메이션이 더 가중치를 적용받을지 우선 순위를 정하길 원합니다. 물론 이때 모든 가중치의 합이 수동으로 100%가 되도록 할 수도 있겠지만 레이어들을 사용하는 것이 훨씬 쉬운 방법이 됩니다.


레이어만들기 예제 Layering Example


한 예로써 사용자가 사격하고, 쉬고, 그리고 걷는 애니메이션이 있다고 가정합니다. 걷는 애니메이션과 쉬는 애니메이션은 플레이어의 속도에 따라 블렌드되어 섞이겠지만, 사격 버튼이 눌러졌을때는 사격하는 애니메이션만이 나와야 합니다. 그러므로 사격 애니메이션은 이들 중 더 높은 우선 순위를 가지게 됩니다.
이것을 위한 가장 쉬운 방법은 사격 중에도 걷고 쉬는 애니메이션을 재생하게 하는 것입니다. 그러기 위해서는 사격 애니메이션을 쉬거나 걷기 보다 높은 레이어로 위치시켜야 하고 이것은 사격 애니메이션이 블렌드 가중치 blend weights 를 가장 우선 순위로 받게 된다는 뜻입니다. 걷기와 쉬기 애니메이션은 사격 애니메이션이 100% 블렌드 가중치를 다 사용하지 않을 때에만 가중치를 받게 됩니다. 그래서 크로스페이딩 CrossFading 으로 사격 애니메이션을 걷기나 쉬기 애니메이션 안에 들여보낼 때 사격 애니메이션의 가중치는 0에서 시작해 짧은 순간에 100%로 가중치가 변할 것입니다. 처음에 걷기와 정지레이어는 블렌드 가중치를 받지만 사격 애니메이션이 완전히 들어오면 (fade in) 가중치를 전혀 받을 수 없게 될 것입니다. 이것은 정확히 우리가 원하던 바입니다!

function Start () {
   // 모든 애니메이션을 룹으로 설정
   animation.wrapMode = WrapMode.Loop;
   // 사격은 제외
   animation["shoot"].wrapMode = WrapMode.Once;
 
   // 쉬기와 걷기를 아래 레이어로 놓습니다. (디폴트 레이어는 항상 0)
   // 이것은 두 가지를 할 것입니다.
   // - 사격과 쉬기/걷기는 다른 레이어에 있으므로,
   //   크로스페이드 CrossFade 를 호출할 때 그들은 서로의 재생에 영향을 끼치지 않을 것입니다..
   // - 사격은 더 높은 레이어에 있으므로,
   //  페이드-인 (fade-in) 할때 그 애니메이션은 쉬기/걷기 애니메이션을 대체할 것입니다.
   animation["shoot"].layer = 1;
 
   // 이미 재생되는 애니메이션을 정지시킵니다.Stop animations that are already playing
   //(사용자가 자동재생을 비활성화 시켰을 경우)
   animation.Stop();
}
 
function Update () {
   // 눌려진 키에 따라서,
   // 걷기나 쉬기 애니메이션을 재생합니다.
   if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
      animation.CrossFade("walk");
   else
      animation.CrossFade("idle");
 
   // Shoot
   if (Input.GetButtonDown ("Fire1"))
      animation.CrossFade("shoot");
} 

기본 설정으로 animation.Play()나 animation.CrossFade() 는 같은 레이어에 있는 애니메이션을 정지시키거나 사라지게 fade-out 합니다. 이것이 대부분의 경우 이것은 사용자가 원하는 바입니다. 위의 우리의 예제에서는 쉬기/걷기는 사격 애니매이션에 영향을 주지 않으며 그 반대의 경우도 마찬가지 입니다 (원한다면animation.CrossFade의 옵션 파라미터에서 이 것을 바꿀 수 있습니다).

애니메이션 믹싱 Animation Mixing


애니메이션 믹싱은 애니메이션을 몸의 어떤 일 부분에만 적용시켜 게임에서 생성해야 하는 애니메이션의 수를 줄여줍니다. 이것은 그런 애니메이션들이 다른 애니메이션들과 여러 조합으로 이루어져 사용될 수 있다는 뜻입니다.
사용자는 주어진 애니메이션상태 AnimatioState 에 AddMixingTransform()을 호출하여 애니메이션 믹싱 트랜스폼 animation mixing transform 을 다른 애니메이션에 더합니다.

믹싱 예 Mixing Example


믹싱의 한 예로는 손을 흔드는 애니메이션이 있습니다. 사용자는 캐릭터가 쉬거나 걸을 때 이 손 흔드는 애니메이션을 사용하길 원합니다. 애니메이션 믹싱이 없다면 사용자는 걸으며 손 흔드는 것 쉬면서 손흔드는 두개의 애니메이션을 만들어야 할 것입니다. 그러나 만약 사용자가 손 흔드는 애니메이션에 어깨 트랜스폼을 믹싱 트랜스폼으로써 추가하면, 손 흔드는 애니메이션은 어깨 조인트에서 손까지는 완전히 제어할 수 있게 될 것입니다. 나머지 몸은 그것에 의해 영향을 받지 않기 때문에 캐릭터는 쉬거나 걷는 애니메이션을 계속할 것입니다. 그러므로 몸의 나머지 부분이 쉬거나 걷는 동안에 손이 흔들리게 하려면 위와 같은 단 하나의 애니메이션 만이 필요하게 됩니다.

/// 트랜스폼 변수를 사용하여 믹싱 트랜스폼을 더합니다.
var shoulder : Transform;
animation["wave_hand"].AddMixingTransform(shoulder);
경로 path 를 이용한 또 다른 예.
function Start () {
   // 경로를 이용하여 믹싱 트랜스폼을 더합니다.
   var mixTransform : Transform = transform.Find("root/upper_body/left_shoulder");
   animation["wave_hand"].AddMixingTransform(mixTransform);
}

부가 애니메이션 Additive Animations


부가 애니메이션 Additive animation 과 애니메이션 믹싱은 게임을 위해 생성해야 하는 애니메이션 수를 줄이는 것을 줄이고, 얼굴표정 facial 애니메이션을 만드는데 중요한 역할을 합니다.
사용자가 걷거나 뛰면서 방향을 돌때 옆으로 기우는 캐릭터를 만든다고 가정해 봅시다. 이 경우 각각 애니메이션이 필요한 다음과 같은 네가지 조합이 필요하게 됩니다: 왼쪽으로 기울며 걷기 walk-lean-left, 오른쪽으로 기울며 걷기 walk-lean-right, 왼쪽으로 기울며 뛰기 run-lean-left, 오른쪽으로 기울며 뛰기 run-lean-right. 각 조합을 위해 각각 별개의 애니메이션을 만드는 것은 이와 같은 간단한 경우에도 훨씬 더 많은 추가 작업을 시키게 되고, 다른 액션들이 추가될 때마다 조합의 수는 기하급수적으로 늘어날 것입니다. 다행히도 가산 애니메이션 additive animation 과 믹싱은 단순 움직임들의 조합을 위해 각각 따로 애니메이션을 만들어야 하는 번잡함을 줄여 줍니다.

가산 애니메이션의 예 Additive Animation Example


가산 애니메이션은 한 애니메이션의 효과를 재생중인 다른 애니메이션들 위에 겹치게 overlay 합니다. 가산 애니메이션을 만들때 유니티는 애니메이션 클립의 첫번째 프레임과 현재 프레임의 차이를 계산할 것입니다. 그리고 이 차이를 다른 모든 재생 중인 애니메이션 위에 적용합니다.
다시 아까의 예로 돌아가서 이제 사용자는 왼쪽이나 오른쪽으로 기운 애니메이션을 만들면 유니티는 이것을 걷거나 쉬거나 뛰는 동작의 애니메이션 위에 상위 레이어로 놓을 수 있습니다.

이것을 만들기 위한 코드입니다:
private var leanLeft : AnimationState;
private var leanRight : AnimationState;
 
function Start () {
   leanLeft = animation["leanLeft"];
   leanRight = animation["leanRight"];
 
   //기우는 애니메이션 lean animation 을 별개의 레이어에 놓아서,
   //CrossFade 를 호출하는 다른 것들이 그것에 영향을 주지 않도록 합니다.
   leanLeft.layer = 10;
   leanRight.layer = 10;
 
   //기우는 애니메이션을 가산 additive 으로 설정합니다.
   leanLeft.blendMode = AnimationBlendMode.Additive;
   leanRight.blendMode = AnimationBlendMode.Additive;
 
   //기우는 애니메이션을 ClampForever 로 설정합니다.
   //ClampForever가 설정되면 애니메이션은 클립의 끝에 도달해도
   //자동적으로 정지되지 않습니다.
   leanLeft.wrapMode = WrapMode.ClampForever;
   leanRight.wrapMode = WrapMode.ClampForever;
 
   //애니메이션을 활성화 Enable 하고 그것을 완전히 들어오게 fade in 합니다.
   //여기서 사용자는 animation.Play 를 사용하지 않습니다. 왜냐하면
   //그것은 업데이트 함수에서 시간을 수동적으로 조절할 수 있기 때문입니다.
   //대신에 사용자는 그냥 애니메이션을 활성화시키고, 그것을 최대 가중치 weight 로 설정합니다.
   leanRight.enabled = true;
   leanLeft.enabled = true;
   leanRight.weight = 1.0;
   leanLeft.weight = 1.0;
 
   //테스트를 위해서 걷기 애니메이션을 재생한 후 반복 Loop 을 시킵니다.
   animation["walk"].wrapMode = WrapMode.Loop;
   animation.Play("walk");
}
 
//모든 프레임을 정규화된 normalized 시간으로 설정합니다.
//사용자가 적용시키기 원하는 정도에 따라서 말입니다.
function Update () {
   var lean = Input.GetAxis("Horizontal");
   // normalizedTime 은 첫 프레임때는 0 이고 클립의 마지막 프레임에는 1 이 됩니다.
   leanLeft.normalizedTime = -lean;
   leanRight.normalizedTime = lean;
} 

팁: 가산 애니메이션을 사용할 때 사용자가 가산 애니메이션과 함께 사용된 모든 트랜스폼 위에 가산이 아닌 다른 일반 애니메이션들도 같이 재생하는 것은 굉장히 중요합니다. 그렇지 않으면 그 애니메이션들은 마지막 프레임의 결과 위에 추가되 얹혀질 것입니다. 이것은 확실히 사용자가 원하는 바가 아닐 것입니다.

순차적으로 캐릭터 애니메이션화 하기 Animating Characters Procedurally


사용자는 가끔 캐릭터의 본 bone 을 순차적으로 애니메이션 만들기를 원합니다. 예를 들어, 사용자는 3D공간에서 캐릭터의 머리가 목표점을 추적하는 스크립트에 의해 조정되어 어느 한 점을 바라보기를 원합니다. 다행히도 유니티에서 본 bone 들은 그 스킨된 메쉬를 움직이는 트랜스폼일 뿐이기에 유니티는 이것을 매우 쉽게 할 수 있습니다. 사용자는 스크립트를 써서 어떤 게임오브젝트의 트랜스폼을 다루듯 캐릭터의 본들도 제어할 수 있는 것입니다.
한가지 중요하게 알아야 할 것은 애니메이션 시스템은 Update() 함수 후에 그리고 LateUpdate() 함수 전에 트랜스폼들을 업데이트 한다는 것입니다. 그러므로 만약 사용자가LookAt() 함수를 사용하고 싶다면 사용자는 사용자가 정말로 애니메이션을 오버라이딩 override 하는 것을 확실히 하기 위해 그 함수를 LateUpdate() 안에서 해야만 합니다.
랙돌 Ragdoll 들도 같은 방법으로 생성됩니다. 사용자는 단지 강체 Rigidbodies, 캐릭터 조인트 Character Joints 그리고 캡슐 충돌체 Capsule Colliders 들을 다른 본들에 붙여주기만 하면 됩니다. 그럼 이것은 사용자의 스킨된 캐릭터를 물리적으로 애니메이션화 하게 됩니다.

애니메이션 플레이백과 샘플링 Animation Playback and Sampling


이 섹션은 유니티에서 애니메이션들이 엔진에 의해 재생될 때 어떻게 샘플링이 되는지 설명해 줍니다.
애니메이션 클립 AnimationClips 들은 보통 고정된 프레임 비율로 만들어 집니다. 예를 들어, 사용자는 3D 맥스나 마야에서 프레임 속도 60fps (frames per second) 의 애니메이션을 만들수 있습니다. 유니티에서 그 애니메이션을 불러올 때 이 프레임 속도는 임포터 importer 에 의해 읽히게 되어 불려온 애니메이션의 데이타도 60 fps로 샘플링 됩니다.
하지만 게임은 일반적으로 다양한 프레임 속도로 실행됩니다. 프레임 속도는 어떤 컴퓨터에서는 다른 컴퓨터에서보다 더 높을 수 있고, 특정 순간에 카메라가 보고 있는 뷰의 복잡도에 따라 1초부터 수 초까지 또 다양한 결과를 냅니다. 기본적으로 이것은 게임이 실행되고 있는 프레임의 정확한 속도에 관해 우리는 어떤 가정도 만들수 없다는 것을 의미합니다. 즉 애니메이션이 60 fps로 만들어 졌어도 이것은 56.72 fps나 83.14 fps 혹은 어떤 다른 fps 속도로도 재생될지 모르는 것입니다.
그래서 그 결과로, 유니티는 애니메이션을 원래 지정되어진 프레임 속도가 아닌 이런 다양한 속도로 샘플링을 하게 됩니다. 다행히도 3D 컴퓨터 그래픽 애니메이션은 개별적으로 분리된 프레임이 아닌 연속적인 커브 curve 로 이루어져 있습니다. 이런 커브들은 원래의 애니메이션의 프레임들의 시간들에 딱딱 들어맞는 것이 아니라 어떤 시간에나 샘플링 될 수 있게 되어 있습니다. 그래서 실제적으로는 만약 게임이 만들어진 것보다 더 높은 프레임 속도로 실행이 될 경우 애니메이션은 애니메이션이 제작된 소프트웨어에서보다 더 부드럽고 유연하게 보일 것입니다.
가장 실제적인 상황에서는 사용자는 유니티가 애니메이션을 다양한 프레임 속도 variable fps 로 샘플을 한다는 것은 무시해도 좋습니다. 하지만 만약 사용자가 트랜스폼이나 속성을 어떤 아주 특정한 설정으로 애니메이트하는 애니메이션들에 의지하는 게임플레이 로직을 가지고 있다면, 사용자는 재샘플링 resampling 이 보이지 않는 곳에서 일어난다는 것을 알고 있어야 합니다. 예를 들어, 만약 사용자가 30프레임에 걸쳐 객체가 0에서 180도로 회전하는 애니메이션을 가지고 있고 그리고 그것이 언제 중간까지 도달했는지 코드에서 알고 싶다면, 사용자는 현재 회전 각도가 90도인지 체크하는 조건문을 만들어서 확인하면 안됩니다. 유니티는 애니메이션을 게임속의 다양한 프레임 속도로 샘플링을 하므로, 회전이 90도가 조금 안될때 샘플링을 하고 나중에는 90도 바로 이후에 할지도 모릅니다. 만약 사용자가 애니메이션에서 어떤 특정 점에 다다랐을 때 알림 받기를 원한다면 AnimationEvent를 이용해야 합니다.
또한 다양한 프레임 속도의 샘플링의 결과로 WrapMode.Once 를 사용한 애니메이션이 재생될 때 정확히 마지막 프레임에서 샘플링되지 않을 수도 있다는 것에 주의하세요. 게임의 한 프레임에서는 애니메이션의 마지막 바로 전에 샘플되고, 다음 프레임에서는 시간이 애니메이션의 길이를 초과해 버려 비활성화되고 더 이상 샘플링이 되지 않을지도 모릅니다. 만약 마지막 프레임이 반드시 샘플링이 되게 해야한다면 WrapMode.ClampForever''를 사용해야 합니다. 이 경우 사용자가 애니메이션을 직접 멈출때까지 마지막 프레임 샘플링을 계속 할 것입니다.


참고 : https://openwiki.kr/unity/animationscripting#%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98_%ED%94%8C%EB%A0%88%EC%9D%B4%EB%B0%B1%EA%B3%BC_%EC%83%98%ED%94%8C%EB%A7%81_animation_playback_and_sampling





2017년 12월 18일 월요일

Unity - Scripting - C# - Coroutine


코루틴(Coroutine)


함수를 호출하면 반환값을 반환하기 전에 실행 완료됩니다. 즉, 함수에서 수행되는 작업은 하나의 프레임에서 수행된다는 것을 의미하고, 함수 호출은 절차적 애니메이션을 포함하거나 시간의 경과와 함께 일련의 이벤트에는 사용할 수 없습니다. 예를 들어, 오브젝트의 알파(투명도)가 완전히 투명해질 때까지 서서히 계속 감소하는 장면을 상정했다고 합시다.
void Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
    }
}

위의 상태에서 Fade 함수가 원하는대로 효과를 얻을 수 없습니다. Fade가 시각적으로 알 수 있게 하기 위해서 알파는 몇 프레임에 걸쳐 렌더링되는 중간값으로 변경 한 후 점점 감소할 필요가 있습니다. 그러나 위의 함수는 하나의 프레임에서만 실행됩니다. 중간값은 시각적으로 알 수 없고, 오브젝트는 순간적으로 투명해집니다.
Update 함수에 코드를 추가하는 것도 프레임마다 페이드 할 수 있습니다. 그러나 이러한 작업은 보통 코루틴을 사용하면 편리합니다.
코루틴은 실행을 중지하여 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");
    }
}

UnityScript에서는 좀 더 간단합니다. yield statement를 포함하는 함수는 코루틴으로 해석되어 IEnumerator 반환 형식은 명시적으로 선언될 필요가 없습니다:
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;
    }
}

또한 UnityScript에서 코루틴을 시작하는 경우, 일반 함수와 동일하게 호출합니다:
function Update() {
    if (Input.GetKeyDown("f")) {
        Fade();
    }
}

Fade 함수의 루프 카운터는 코루틴의 라이프 사이클을 통해 올바른 값을 유지합니다. yield 중에 모든 변수 또는 파라미터가 올바르게 보존됩니다.
기본적으로 코루틴은 yield 한 직후의 프레임에서 재개되지만, 지연했다가 다시 시작하려면 WaitForSeconds 함수를 사용합니다:
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);
    }
}

UnityScript에서는:
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 WaitForSeconds(0.1);
    }
}

이 방법으로 효과를 일정한 시간 범위에서 펼칠 수 있지만, 최적화 방법으로 해도 편리합니다. 게임 중의 태스크는 정기적으로 수행해야 하며, 간단한 방법은 Update 함수에서 할 수 있습니다. 그러나 이 함수는 초당 몇 번이나 호출됩니다. 작업이 너무 자주 반복할 필요가 없는 경우, 코루틴에 넣어 매 프레임 실행하지 않고 정기적으로 업데이트 할 수 있습니다. 예를 들자면, 적이 근처에 있는 것을 플레이어에게 알리는 알람입니다. 코드는 다음과 같습니다:
function ProximityCheck() {
    for (int i = 0; i < enemies.Length; i++) {
        if (Vector3.Distance(transform.position, enemies[i].transform.position) < dangerDistance) {
                return true;
        }
    }
    
    return false;
}

적이 많은 경우에 이 함수를 매 프레임 호출하여 현저한 오버 헤드를 초래할 지도 모릅니다. 그러나 코루틴을 사용하여 1/10 초 간격으로 호출할 수 있습니다:
IEnumerator DoCheck() {
    for(;;) {
        ProximityCheck;
        yield return new WaitForSeconds(.1f);
    }
}

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

출처 : https://docs.unity3d.com/kr/current/Manual/Coroutines.html

출처 : http://theeye.pe.kr/archives/2725





홈

MSSQL - Cursor vs Temp Table

#테이블 변수사용의 예 use pubs go declare @tmptable table (     nid int identity(1,1) not null,     title varchar (80) not null ) -- 테이블 변수 선언 inse...