SlideShare a Scribd company logo
1 of 18
유니티 고급 과정
강체(RigidBody)
- ConstantForce 사용법
- Torque 사용법 (양수, 음수 어떠한 의미를 갖는가?)
- AddForce, AddTorque
조인트 사용법
오브젝트 풀
정리
Kiyoung Moon(문기영)
강체
예제> testRigidBody
가장 간단한 박스를 만들고
RigidBody 컴포넌트를 이용해서
강체를 구현한다.
깊이감을 위해 그림자 처리를
한다.
강체
강체를 움직이기 위해 힘, 토크를
설정해 주어야 한다.
유니티에서는 Constant_Force
컴포넌트를 제공하고 있는데
이것을 이용하면 간단하게 힘,
토크를 줄 수 있다.
이때 토크의 방향을 설정하는 것이
중요한데 왼손, 오른손 법칙을 이용해서 그 방향을 알 수 있다.
강체
스크립트를 이용해 강체를 움직여 보자.
씬 testRigidBody_ForceTorqueByScript를 보면 force_torque.cs를 컴포넌트로
사용하고 있고 내부 구조는 다음과 같다.
using UnityEngine;
using System.Collections;
public class force_torque : MonoBehaviour
{
// Update is called once per frame
void Update ()
{
gameObject.rigidbody.AddForce( new Vector3( -1.08f, 0, 0 ) );
gameObject.rigidbody.AddTorque( new Vector3( 0, 0, 0.56f ) );
}
}
스크립트를 이용해 강체를 움직여 보자.
여러 강체를 한 묶음으로 만들어 보자.
여러 강체를 합쳐서 하나로 표현
가능하다. 유니티는 Fixed Joint를
제공하는데 이것을 이용해서 여러
강체를 하나로 표현 할 수 있다.
testRigidBody_Fun를 보면 강사가
간단하게 데모를 만들어 보았다.
‘괴혼’이라는 게임의 동작 원리를 살펴
볼 수 있다.
주의 : 실제로 Fixed Joint는 Fix하지
않기 때문에 Configure Joint를 사용한
다.
조인트(Joint)
유니티는 여러 조인트 타입을 제공하고 있다.
Fixed Joint
Spring Joint
Hinge Joint
Configurable
Fixed Joint
강체를 설정했지만 물리에 의해서 움직이지 않게 하려면 Fixed Joint를 사용한
다. 연결할 몸통(Body)를 설정하면 해당 부모 객체의 로컬 좌표계에 기반해
서 위치값을 설정한다.
연결할 몸통을 설정하지 않으면 월드에서 움직이지 않는다.
Spring Joint
스프링 조인트는 강체들을 스프링으로 연결할 때 사용한다.
다음 예제 testJoint를
참고 하도록 하자.
빨간색 화살표가 가리키는
강체는 부모 객체이고
FixedJoint로 설정했다.
그렇기 때문에 월드에서 움직이지 않는다.
노란색 화살표가 가리키는
강체는 자식 객체이고
Spring Joint로 설정했다.
Anchor를 기준으로 360도 방향으로 모두 움직
일 수 있으며 Min, Max Distance를 설정해서
최소 혹은 최대로 늘어질 수 있는 길이를 설정할 수 있다. Spring은 스프링의 강도인데 이 값이 작으면 작을 수록 더 많이 늘어질 수 있다.
Spring Joint를 어디에 사용할 수 있나?
예> RopePong
강사가 C#으로 만들었던 미니 게임 예제는 스프링을 이용해서 구현했다.
스프링 조인트를 이용해서 천 시뮬레이션도 구현이 가능하다.
Spring Joint로 Rope만들기
Unity로 구현해본 Rope
예제>testJoint_Rope
Hinge Joint
Hinge Joint는 정해진 축을
기준으로만 회전할 수 있는 조인트다.
오른쪽 그림을 보면 알 수 있듯이 축이
정해져 있고 그 축을 기준으로 회전한다.
Hinge Joint
Configurable Joint
오브젝트 풀(Object Pool)
- 이전 강의에서 설명한 메모리 풀의 장점?
- 오브젝트 풀도 같은 개념. 유니티에서는 필수!
- 게임코디(gamecodi.com)의 닉네임 ‘태풍의그라운드’님의 오브젝트 풀을
간단히 살펴 보도록 하자.
전체 소스
using System.Collections;
using System.Collections.Generic;
public class CGameObjectPool<T> where T : class
{
// Instance count to create.
short count;
public delegate T Func();
Func create_fn;
// Instances.
Stack<T> objects;
public CGameObjectPool(short count, Func fn) {
this.count = count;
this.create_fn = fn;
this.objects = new Stack<T>(this.count);
allocate();
}
void allocate() {
for (int i=0; i<this.count; ++i) {
this.objects.Push(this.create_fn());
}
}
public T pop() {
if (this.objects.Count <= 0) {
allocate();
}
return this.objects.Pop();
}
public void push(T obj) {
this.objects.Push(obj);
}
}
델리게이트를 왜 사용했나?
설계의 기본 “분리(Separation)”
클라이언트 코드와 오브젝트 풀을 분리하기 위함.
개선할 점은?
정리

More Related Content

Viewers also liked

The_Residency_Coimbatore_Experience
The_Residency_Coimbatore_ExperienceThe_Residency_Coimbatore_Experience
The_Residency_Coimbatore_ExperienceGOPALA KRISHNAN.S
 
Kreativita online a její výhody pro školy
Kreativita online a její výhody pro školyKreativita online a její výhody pro školy
Kreativita online a její výhody pro školyNET University, s.r.o.
 
Hướng dẫn đổi đá
Hướng dẫn đổi đáHướng dẫn đổi đá
Hướng dẫn đổi đápikeman39
 
FINAL SHEETS SEMINAR 21 MAART CHINA OUDEREN
FINAL SHEETS SEMINAR 21 MAART CHINA OUDERENFINAL SHEETS SEMINAR 21 MAART CHINA OUDEREN
FINAL SHEETS SEMINAR 21 MAART CHINA OUDERENArnaud Veere
 
Financial Regulation
Financial Regulation Financial Regulation
Financial Regulation Evan Rassman
 
Leksion 10 -_manaxheri_s_ipermares
Leksion 10 -_manaxheri_s_ipermaresLeksion 10 -_manaxheri_s_ipermares
Leksion 10 -_manaxheri_s_ipermaresMikena Çako
 
Leksion 12 -_gjetja_e_parave_per_biznesin_tuaj
Leksion 12 -_gjetja_e_parave_per_biznesin_tuajLeksion 12 -_gjetja_e_parave_per_biznesin_tuaj
Leksion 12 -_gjetja_e_parave_per_biznesin_tuajMikena Çako
 

Viewers also liked (14)

It 090210116057
It 090210116057It 090210116057
It 090210116057
 
Kowshikaa consultancy
Kowshikaa consultancyKowshikaa consultancy
Kowshikaa consultancy
 
Kowshikaa consultancy
Kowshikaa consultancyKowshikaa consultancy
Kowshikaa consultancy
 
Anon phpmysql
Anon phpmysqlAnon phpmysql
Anon phpmysql
 
The_Residency_Coimbatore_Experience
The_Residency_Coimbatore_ExperienceThe_Residency_Coimbatore_Experience
The_Residency_Coimbatore_Experience
 
Kreativita online a její výhody pro školy
Kreativita online a její výhody pro školyKreativita online a její výhody pro školy
Kreativita online a její výhody pro školy
 
Hướng dẫn đổi đá
Hướng dẫn đổi đáHướng dẫn đổi đá
Hướng dẫn đổi đá
 
RPM camille claudel
RPM camille claudelRPM camille claudel
RPM camille claudel
 
FINAL SHEETS SEMINAR 21 MAART CHINA OUDEREN
FINAL SHEETS SEMINAR 21 MAART CHINA OUDERENFINAL SHEETS SEMINAR 21 MAART CHINA OUDEREN
FINAL SHEETS SEMINAR 21 MAART CHINA OUDEREN
 
MS SQL BI platform
MS SQL BI platformMS SQL BI platform
MS SQL BI platform
 
Financial Regulation
Financial Regulation Financial Regulation
Financial Regulation
 
Leksion 10 -_manaxheri_s_ipermares
Leksion 10 -_manaxheri_s_ipermaresLeksion 10 -_manaxheri_s_ipermares
Leksion 10 -_manaxheri_s_ipermares
 
Leksion 12 -_gjetja_e_parave_per_biznesin_tuaj
Leksion 12 -_gjetja_e_parave_per_biznesin_tuajLeksion 12 -_gjetja_e_parave_per_biznesin_tuaj
Leksion 12 -_gjetja_e_parave_per_biznesin_tuaj
 
Kowshikaa consultancy overseas
Kowshikaa consultancy overseas Kowshikaa consultancy overseas
Kowshikaa consultancy overseas
 

More from Kiyoung Moon

Image generation compression using genetic algorithm
Image generation compression using genetic algorithmImage generation compression using genetic algorithm
Image generation compression using genetic algorithmKiyoung Moon
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기Kiyoung Moon
 
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅Kiyoung Moon
 
Cross-Platform Game Engine
Cross-Platform Game EngineCross-Platform Game Engine
Cross-Platform Game EngineKiyoung Moon
 
코히런트 Gt(coherent gt) 통합 및 간단한 사용법
코히런트 Gt(coherent gt) 통합 및 간단한 사용법코히런트 Gt(coherent gt) 통합 및 간단한 사용법
코히런트 Gt(coherent gt) 통합 및 간단한 사용법Kiyoung Moon
 
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법Kiyoung Moon
 
버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제Kiyoung Moon
 
유니티로 해보는 게임 프로토타이핑
유니티로 해보는 게임 프로토타이핑유니티로 해보는 게임 프로토타이핑
유니티로 해보는 게임 프로토타이핑Kiyoung Moon
 

More from Kiyoung Moon (8)

Image generation compression using genetic algorithm
Image generation compression using genetic algorithmImage generation compression using genetic algorithm
Image generation compression using genetic algorithm
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
 
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
 
Cross-Platform Game Engine
Cross-Platform Game EngineCross-Platform Game Engine
Cross-Platform Game Engine
 
코히런트 Gt(coherent gt) 통합 및 간단한 사용법
코히런트 Gt(coherent gt) 통합 및 간단한 사용법코히런트 Gt(coherent gt) 통합 및 간단한 사용법
코히런트 Gt(coherent gt) 통합 및 간단한 사용법
 
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
 
버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제
 
유니티로 해보는 게임 프로토타이핑
유니티로 해보는 게임 프로토타이핑유니티로 해보는 게임 프로토타이핑
유니티로 해보는 게임 프로토타이핑
 

유니티 고급 과정 -4-

  • 1. 유니티 고급 과정 강체(RigidBody) - ConstantForce 사용법 - Torque 사용법 (양수, 음수 어떠한 의미를 갖는가?) - AddForce, AddTorque 조인트 사용법 오브젝트 풀 정리 Kiyoung Moon(문기영)
  • 2. 강체 예제> testRigidBody 가장 간단한 박스를 만들고 RigidBody 컴포넌트를 이용해서 강체를 구현한다. 깊이감을 위해 그림자 처리를 한다.
  • 3. 강체 강체를 움직이기 위해 힘, 토크를 설정해 주어야 한다. 유니티에서는 Constant_Force 컴포넌트를 제공하고 있는데 이것을 이용하면 간단하게 힘, 토크를 줄 수 있다. 이때 토크의 방향을 설정하는 것이 중요한데 왼손, 오른손 법칙을 이용해서 그 방향을 알 수 있다.
  • 4. 강체 스크립트를 이용해 강체를 움직여 보자. 씬 testRigidBody_ForceTorqueByScript를 보면 force_torque.cs를 컴포넌트로 사용하고 있고 내부 구조는 다음과 같다. using UnityEngine; using System.Collections; public class force_torque : MonoBehaviour { // Update is called once per frame void Update () { gameObject.rigidbody.AddForce( new Vector3( -1.08f, 0, 0 ) ); gameObject.rigidbody.AddTorque( new Vector3( 0, 0, 0.56f ) ); } } 스크립트를 이용해 강체를 움직여 보자.
  • 5. 여러 강체를 한 묶음으로 만들어 보자. 여러 강체를 합쳐서 하나로 표현 가능하다. 유니티는 Fixed Joint를 제공하는데 이것을 이용해서 여러 강체를 하나로 표현 할 수 있다. testRigidBody_Fun를 보면 강사가 간단하게 데모를 만들어 보았다. ‘괴혼’이라는 게임의 동작 원리를 살펴 볼 수 있다. 주의 : 실제로 Fixed Joint는 Fix하지 않기 때문에 Configure Joint를 사용한 다.
  • 6. 조인트(Joint) 유니티는 여러 조인트 타입을 제공하고 있다. Fixed Joint Spring Joint Hinge Joint Configurable
  • 7. Fixed Joint 강체를 설정했지만 물리에 의해서 움직이지 않게 하려면 Fixed Joint를 사용한 다. 연결할 몸통(Body)를 설정하면 해당 부모 객체의 로컬 좌표계에 기반해 서 위치값을 설정한다. 연결할 몸통을 설정하지 않으면 월드에서 움직이지 않는다.
  • 8. Spring Joint 스프링 조인트는 강체들을 스프링으로 연결할 때 사용한다. 다음 예제 testJoint를 참고 하도록 하자. 빨간색 화살표가 가리키는 강체는 부모 객체이고 FixedJoint로 설정했다. 그렇기 때문에 월드에서 움직이지 않는다. 노란색 화살표가 가리키는 강체는 자식 객체이고 Spring Joint로 설정했다. Anchor를 기준으로 360도 방향으로 모두 움직 일 수 있으며 Min, Max Distance를 설정해서 최소 혹은 최대로 늘어질 수 있는 길이를 설정할 수 있다. Spring은 스프링의 강도인데 이 값이 작으면 작을 수록 더 많이 늘어질 수 있다.
  • 9. Spring Joint를 어디에 사용할 수 있나? 예> RopePong 강사가 C#으로 만들었던 미니 게임 예제는 스프링을 이용해서 구현했다. 스프링 조인트를 이용해서 천 시뮬레이션도 구현이 가능하다.
  • 10. Spring Joint로 Rope만들기 Unity로 구현해본 Rope 예제>testJoint_Rope
  • 11. Hinge Joint Hinge Joint는 정해진 축을 기준으로만 회전할 수 있는 조인트다. 오른쪽 그림을 보면 알 수 있듯이 축이 정해져 있고 그 축을 기준으로 회전한다.
  • 14. 오브젝트 풀(Object Pool) - 이전 강의에서 설명한 메모리 풀의 장점? - 오브젝트 풀도 같은 개념. 유니티에서는 필수! - 게임코디(gamecodi.com)의 닉네임 ‘태풍의그라운드’님의 오브젝트 풀을 간단히 살펴 보도록 하자.
  • 15. 전체 소스 using System.Collections; using System.Collections.Generic; public class CGameObjectPool<T> where T : class { // Instance count to create. short count; public delegate T Func(); Func create_fn; // Instances. Stack<T> objects; public CGameObjectPool(short count, Func fn) { this.count = count; this.create_fn = fn; this.objects = new Stack<T>(this.count); allocate(); } void allocate() { for (int i=0; i<this.count; ++i) { this.objects.Push(this.create_fn()); } } public T pop() { if (this.objects.Count <= 0) { allocate(); } return this.objects.Pop(); } public void push(T obj) { this.objects.Push(obj); } }
  • 16. 델리게이트를 왜 사용했나? 설계의 기본 “분리(Separation)” 클라이언트 코드와 오브젝트 풀을 분리하기 위함.