2011. 6. 27. 13:44ㆍ게임 개발/OpenGL
Become a videogame developer 라는 부제를 가지고 있는 사이트입니다.
http://www.unity3dstudent.com/
교육 단계 모두 동영상으로 구성되어 있어서 , 공부하는데 정말 수월하게 진행 될수 있었습니다.
아래 내용은 제가 공부 하는데, 정리한 내용들이니..
위에 사이트 가셔서 직접 공부하시는 것이 더더욱 도움이 많이 될것입니다. ^^
기본적으로 해당 강좌는 모두 javascript 로 구현되어져 있습니다.
Adding Mass / Gravity with Rigidbodies
해당 객체에 아래와같이 함수를 추가해주시고, 중력을 줍시다.
기본적으로 이렇게 중력을 추가하는 것이 가장 기본이고, 이게 너무 신기 했습니다.
1. Basic Collision Detection
충돌 탐지 : 해당 객체에 아래와 같이 함수를 추가해 보시면..
아래와 같이 디버깅 창에 로그가 나타납니다. 충돌이 되는 순간을 알수 있다라는 것 알게 되었지요
function OnCollisionEnter(theCollision : Collision){
if(theCollision.gameObject.name == "Floor"){
Debug.Log("Hit the floor");
}else if(theCollision.gameObject.name == "Wall"){
Debug.Log("Hit the wall");
}
}
2. Detecting Input
입력값 탐지 : Update 함수는 Play가 되는 동안을 알수 있는 함수이다.
스페이스바를 눌렀을때.. 로그가 나오도록 해봤습니다.
function Update () {
if(Input.GetButtonUp("Jump")){
Debug.Log("We Have Hit the Space Bar!");
}
}
3. Prefabs
Prefabs – How to make them, what they are for, and why!
Hierarchy에서 생성한 객체를 Prefabs 로 생성해서 추가합니다.
그리고 맘대로 쓸수가 있군요.. 한번 만든것을 응용해서 사용하자는 거군요.
4. Destroying Objects
오브젝트를 삭제하는 것을 알려 줍니다.
타겟을 지정하고, 지연시간을 추가할수도 있지요.
function Start () {
Destroy(gameObject.Find("Cube"),2);
}
5.Instantiate to Create Objects
빈 객체(GameObject)에다가.. javascript로 객체 생성을 하고, prefab에다가...
기존에 만들어 놓은 BounyBox(prefab)를 추가하면.. 생성이 되지요
6.SImple Timer
타이머를 추가해서.. 이것저것 로그 찍어봅시다.
5초후에 게임오버가 되는 부분을 Update 상에 추가를 해 놓았군요.
//A simple countdown timer
var myTimer : float = 5.0;
function Update () {
if(myTimer > 0){
myTimer -= Time.deltaTime;
}
if(myTimer <= 0){
Debug.Log("GAME OVER");
}
}
7. Basic Translate Movement
해당 객체를 z축으로 이동시키는 거군요.. 간단 하면서..
여기에서는 크기와 방향을 동시에 나타내는 Vector 클래스가 나오기 시작합니다.
변위(물체가 운동을 하고 있을때 물체의 위치 변화를 말함),속도,가속도,힘 이 벡터의 예제라고 볼수 있다.
이런것들이 바로 크기와 방향을 동시에 나타낼수 있기 때문이다.
//Basic movement of an object with Translate
var speed : float = 5.0;
function Update () {
transform.Translate(Vector3(0,0,speed) * Time.deltaTime);
}
8. Basic Force Movement
힘...해당축으로 밀어주는 힘을 말하는 군요..냐하하하
//Basic force to move a rigidbody object
var power : float = 500.0;
function Start () {
rigidbody.AddForce(Vector3(0,0,power));
}
9.Adding Materials
배경 입히는 것이군요..
10. Audio Basics
스크립트를 통해 사운드를 넣어주게 됩니다.
시작할때 최초 한번 myClip 음악 틀어주고~
만약 PlayClipAtPoint을 사용한다면, 도플러 효과 아시나요.. 뭐 그런 효과들을 충실히 반영한 사운드 효과를 내기 위해,
사용하는 함수 입니다.
//Play an instance using attached AudioSource component
var myClip : AudioClip;
function Start () {
audio.PlayOneShot(myClip);
}
Using PlayClipAtPoint:
//Spawn a new object with AudioSource and Clip set, at a point in the 3D world
var myClip : AudioClip;
function Start () {
AudioSource.PlayClipAtPoint(myClip, transform.position);
}
11. Basic Joints
기본 관절... 헐..이음새 등을 이용하게 되는 군요.. 오홋 정말 신기합니다.
이음새를 연결하여 헐렁 헐렁... 이것을 잘 이용하면 3D 게임등을 더 구체적으로 잘 만들수 있습니다.
12.Input with Axes
방향키로 객체를 조정하는 방법을 배워봅니다.
응용범위가 점점 넓어지는 군요
Input.GetAxis 은 다시 말해,
Edit > Project Settings > Input 에서 보면 입력에 대해서 자세한 설정을 확인 할수 있다.
조이스틱,키보드에 대한 설정이 된다는 말이지
function Update () {
var horiz : float = Input.GetAxis("Horizontal");
Debug.Log(horiz);
transform.Translate(Vector3(horiz,0,0));
}
13. Trigger Collision Detection
객체에 Trigger를 체크 했을때(isTriger), 객체가 통과가 되네요..
테스트 해보면서 또한 통과했을때의 확인할수 있습니다.
function OnTriggerEnter (myTrigger : Collider) {
if(myTrigger.gameObject.name == "box"){
Debug.Log("Box went through!");
}
}
14. GUI Text and Counters
GUIText 객체를 사용하는 방법에 대해서 알아봅니다.
오홋 카운트도 넣을수가 있네요.. 이런 말도 안되는;;
제가 주로 사용하던 3.X 대까지도 Unity 상에서 제공하는 GUI는 거의 사용하지 말라고 하였습니다.
이유는 이넘 때문에 퍼포먼스가 안나온다고 하네요, 프레임별로 계속 각각의 gui 객체가 호출되기 때문에..
그래서 상용 NGUI 같은 경우에는 한 프레임상에서 사용되는 모든 GUI 를 한콜에 다 뿌려주는데 비해..
뭐.. 쓰지 말라니까 쓰지 말아야징...
var Counter : int = 0;
function Update () {
Counter++;
guiText.text = "Counter is: "+Counter;
}
15. Adding Componets via Script
스크립트를 사용해서 다른 객체에게 기능을 추가하는 요소
충돌시에 충돌된 객체이름이 Platform이면 Rigidbody를 추가하는 거군요
function OnCollisionEnter (myCollision : Collision) {
if(myCollision.gameObject.name == "Platform"){
if(!myCollision.gameObject.rigidbody){
myCollision.gameObject.AddComponent(Rigidbody);
}
}
}
16. Switching Scenes
화면 전환입니다.(Build Setting 를 사용할수도 있지요..)
플레이 화면과 결과 화면을 연동에 응용하면 좋을것 같습니다.
var myLevel : String;
function OnCollisionEnter (myCollision : Collision) {
if(myCollision.gameObject.name == "Floor"){
Application.LoadLevel(myLevel);
}
}
17. Tweaking Components via script
스크립트를 이용하여, 불을 켜다...
위와 마찬가지로 충돌하면 빛의 역활을 하는 객체을 찾아서 활성화 시킨후에 강도 조절해 주는..
function OnCollisionEnter (myCollision : Collision) {
if(myCollision.gameObject.name == "Floor"){
var myLight : Light = gameObject.Find("Light").GetComponent(Light);
myLight.enabled = true;
myLight.intensity = 5;
}
}
18.Local vs World Direction
alt 키를 누르면 되고.. Local 과 World Direction은 좀더 찾아서 공부를 해봐야 할 것 같습니다.
function Update () {
//transform.Translate(Vector3(0,0,1) * Time.deltaTime);
var fwd = transform.forward * 100;
rigidbody.AddForce(fwd);
}
19. Following with LookAt()
카메라 이동 컷입니다. 오호홋.. 바로 이거야. 멋쪄브렁
var myTransform : Transform;
function Update () {
transform.LookAt(myTransform);
}
20. IF Statement and Booleans
boolean의 상태값 에 따라 변경하는 방법
var myCheck : boolean = true;
function Update () {
if(myCheck){
guiText.text = "Its on!";
}else{
guiText.text = "Its Off!";
}
if(Input.GetButtonUp("Jump") && myCheck){
myCheck = false;
}else if(Input.GetButtonUp("Jump") && myCheck == false){
myCheck = true;
}
}
21. Finding Distance with Vector3
떨어지는 객체에 대한 거리를 측정하여, 다양한 액션을 취하도록 합니다.
var box : Transform;
function Update () {
var dist : float = Vector3.Distance(box.position, transform.position);
Debug.Log(dist);
if(dist <= 10){
light.enabled = true;
}else{
light.enabled = false;
}
}
22. Pausing Scripts with WaitForSeconds()
yield waitforsecond 을 이용하여 매 2초 마다 box 객체를 생성
더욱 신기한것은 Instantiate 함수 입니다.
계속 인스턴스를 생성하네요 @.@
var box : GameObject;
var readynow : boolean = true;
function Update () {
if(readynow){
MakeBox();
}
}
function MakeBox(){
readynow=false;
Instantiate(box, transform.position, transform.rotation);
yield WaitForSeconds(2);
readynow=true;
}
23. Particle Systems
파티클을 적용 해봅시다. 터지는 효과등에 사용하면 그만이겠군요!
var stars : ParticleEmitter;
function OnCollisionEnter (col : Collision) {
Instantiate(stars, transform.position, transform.rotation);
Destroy(gameObject);
}
24. For Loops
루프를 돌려 보자구용
var myPrefab : Rigidbody;
var distanceMultiplier : float = 2;
function Start(){
var i : int = 0;
var pos : Vector3 = transform.position;
for(i=0; i<=3; i++){
Instantiate(myPrefab, Vector3(pos.x+i*distanceMultiplier, pos.y, pos.z), transform.rotation);
yield WaitForSeconds(0.5);
Debug.Log("made ball "+i);
}
}
25. GUI Texture & mouse Event
드디어.. 버튼 롤오버.. 와 클릭 이벤트를 알아냈군요..
게임내 버튼을 만들면 되겠군요..요걸 가지고
var normalTex : Texture2D;
var hoverTex : Texture2D;
function OnMouseEnter () {
guiTexture.texture = hoverTex;
}
function OnMouseExit(){
guiTexture.texture = normalTex;
}
function OnMouseDown(){
Debug.Log("clicked");
}
26. Using Mathf.Clamp to restrict values
이동의 제한을 두는 방법입니다. Mathf.Clamp 를 이용해서 해당 x축 포지션이 최대 와 최소 값 사이에서만 유지가 가능하는 이야기죠.
Clamp 자체가 꺽쇠 라는 뜻이라는 군요..
function Update () {
var xMove : float = Input.GetAxis("Horizontal") * Time.deltaTime * 20;
transform.Translate(Vector3(xMove,0,0));
transform.position.x = Mathf.Clamp(transform.position.x, -10, 10);
}
27.Using Time.timeScale to Pause
timeScale 를 이용한 일시정지를 만들었습니다. (스페이드바 키를 이용)
요걸로 슬로우 효과도 구현할수도 있고.. 뭐.. 이것저것 다..
var paused : boolean = false;
function Update () {
if(Input.GetButtonUp("Jump")){
if(!paused){
Time.timeScale = 0;
paused=true;
}else{
Time.timeScale = 1;
paused=false;
}
}
}
28. SendMessage() to Call External Functions
자.. 그러니까.. 외부 함수를 SendMessage를 통해서 전달할수가 있다는 말이죠.
콜백이 생각이 나는데요...
var downTexture : Texture2D;
function React () {
renderer.material.mainTexture = downTexture;
yield WaitForSeconds(1);
gameObject.AddComponent(Rigidbody);
}
function OnCollisionEnter(col : Collision) {
if(col.gameObject.name == "Switch"){
gameObject.Find("Block").SendMessage("React");
}
}
Basic 단위에 대해서는 여기까지 였습니다.
자.. 다음 단계로 넘어가봅시다...
'게임 개발 > OpenGL' 카테고리의 다른 글
Unity3D iOS Porting Tips (0) | 2011.08.23 |
---|---|
UnityKorea 강좌 중에 몇가지 정리 (1) | 2011.07.01 |
Sound & Object Collection (0) | 2011.06.30 |
Unity GUI 공부하기 (0) | 2011.06.30 |
Newbie guide to Unity Javascript (초보자를 위한 자바스크립트 가이드) (0) | 2011.06.29 |
Cinema4D Animation & Interaction (0) | 2011.06.28 |
Unity3DStudent 를 이용한 공부 2 (0) | 2011.06.27 |
Unity 3D 개요 (1) | 2011.06.27 |
iOS 3D 게임 프로그래밍 실무 교육 2 (OpenGL) (0) | 2011.05.27 |
iOS 3D 게임 프로그래밍 실무 교육 1 (0) | 2011.05.27 |