Unity3DStudent 를 이용한 공부

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&lt;=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
단위에 대해서는 여기까지 였습니다.
.. 다음 단계로 넘어가봅시다...