안녕하세요? 글뻥입니다. Photon Cloud 2회차 강좌입니다.

* 링크와 소스가 깨진관계로 새로운 강좌와 예제파일은 http://www.wolfpack.pe.kr/939 에서 다운로드 받아주세요.

역시 퍼가는건 자유입니다. =)
하지만 출처 안밝히면 정말 정말 정말 싫어 할겁니다.
(자신이 쓴글도 아닌데 자신이 쓴 글처럼 자신의 블로그에 달아 놓는 행위는 도둑질에다가 글쓴이에 대한 모욕입니다.)

이번에는 Photon에 관련된 내용보다는 차회에 진행할 강좌에서 사용할 게임부터 만들어 보겠습니다.

이름하야~ 짝퉁 파리플라이트!

사용자 삽입 이미지

관련 소스는 [여기]에서 다운로드 가능합니다.

중요한 소스는 달랑 4개입니다.
먼저 MainGame은 적은 전체 게임을 관리하는 녀석입니다.
Player는 말그대로 아군 전투기에 대한 Script이구요,
Enemy는 적입니다.
그리고 나머지 하나가 Beam(총알)에 대한 스크립트입니다.

아마도 초보분들께는 퍼포먼스 튜닝이나 혹은 게임 구조를 만드실때 유용한 Tip 몇개가 포함되어 있을 것 같네요.

MainGame.cs

using UnityEngine;
using System.Collections;

public class MainGame : MonoBehaviour {
    
   //플레이어 Prefab 
    public GameObject Player1;
   //적 Prefab
    public GameObject enemy;
    
   //적이 생성되는 포지션입니다. 총 7개예요.
    private Vector3[] GenPoint = new Vector3[]{
        new Vector3(-4.5f, 10f, 0f), 
        new Vector3(-3f, 10f, 0f), 
        new Vector3(-1.5f, 10f, 0f),
        new Vector3(0f, 10f, 0f),
        new Vector3(1.5f, 10f, 0f),
        new Vector3(3f, 10f, 0f),
        new Vector3(4.5f, 10f, 0f)};

   //적생성된 시간을 기록할 변수입니다.
    private float GenStart = 0f;
   //적생성에 관한 Term 변수입니다.
    private float GenTerm = 3f;
   //적이 떨어지는 속도입니다.
    private float DropSpeed = 5f;

//시작하면 적 생성 시간을 Baseline으로 설정하고 아군전투기를 생성합니다.
        //마지막에  "Quaternion.Euler(new Vector3(0f,0f,180f)"를 사용한 이유는 전투기가 꺼꾸로 출현해서... 쿨럭..
void Start () {
        GenStart = Time.time;
        Instantiate(Player1, new Vector3(0f, 0f, 0f), Quaternion.Euler(new Vector3(0f,0f,180f)));
}

// 매 프레임마다 적 생성 Method를 호출합니다.
void Update () {
        EnemyGen();
}

    //적 생성 Method로 지정한 Term만큼의 시간이 지나면 작동됩니다. 점차 Drop속도가 빨라지도록 설정했습니다.
    void EnemyGen()
    {
        if (GenStart + GenTerm > Time.time) return;
        
        //GenTerm -= 0.01f;
        DropSpeed += 0.02f;
        GenStart = Time.time;
        StartCoroutine("EnemyDrop");
    }
 
    //유니티의 문제점이 C# Base다 보니 Init하거나 Destroy하는데 많은 시간을 소모합니다.
    //기본적으로 Class 즉, Reference Type이기에 어쩔수 없는... ㅡㅡ;;
    //그래서 별도의 Thread로 돌리기 위해 Coroutine을 사용합니다.
    IEnumerator EnemyDrop()
    {
        foreach (Vector3 genposition in GenPoint)
        {
            //생성한 GameObject에 값을 할당합니다.
            GameObject gobj = Instantiate(enemy, genposition, Quaternion.identity) as GameObject;
            gobj.GetComponent<Enemy>().Set_Speed(DropSpeed);
        }
        return null;
    }
}


뭐 게임 끝나는 조건도 없습니다. 걍 끄십시오. ㅡㅡ;;

지금부터는 별게 없는 Enemy.cs를 보겠슴돠.

using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {
    //MainGame에서 설정해주는 떨어지는 속도입니다.
    private float Dropspeed = 0f;

// Update is called once per frame
void Update () {
        //떨어지도록...
        Dropit();
        //어느정도 떨어지면 자동으로 없어지게...
        CheckAutoDie();
}

    //아래로 이동시키는 Method입니다.
    void Dropit()
    {
        transform.Translate(new Vector3(0f, -1f, 0f) * Dropspeed * Time.deltaTime);
    }
    //리소스가 자동으로 없어져야 겠죠? 역시 위에서 설명한대로 Coroutine으로 돌립니다.
    void CheckAutoDie()
    {
        if (transform.position.y > -5f) return;
        StartCoroutine("Die");
    }

    //MainGame에서 이녀석을 호출해서 떨어지는 값을 설정합니다. 그래서 public 선언자는 필수!
    public void Set_Speed(float x)
    {
        Dropspeed = x;
    }

    //총알과 부딪혔을때 죽는 처리해야 합니다.
    void OnTriggerEnter(Collider col)
    {
        if (col.tag != "beam") return;
        StartCoroutine("Die"); 
    }
    //자동으로 리소스에서 없애는 메소드입니다.
    IEnumerator Die()
    {
        Destroy(gameObject);
        return null;
    }
}

참으로 별게 없습니다. ㅡㅡ;; 초보라도 그냥 할 수 있는... (쿨럭..)

이제 주인공이 탈 뱅기인 player.cs파일입니다.

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {
    
    //총알 Prefab
    public GameObject beam;
    //MainGame에서 적을 생성할때와 같은 생성 주기에 대한 변수입니다.
    private float fire_last = 0f;
    private float fire_term = 0.3f;
    //이동속도입니다.
    private float Speed = 10f;

// 드라곤 플라이트와 같이 자동으로 마구마구 쏩니다.
        //대신 키보드의 좌우 키로 움직이도록 했습니다.
void Update () {
        Fire();
        if (Input.GetKey(KeyCode.RightArrow)) Move_Right();
        if (Input.GetKey(KeyCode.LeftArrow)) Move_Left();
}

    //오른쪽 움직임입니다. 현재 오브젝트가 꺼꾸로 뒤집혀 있다는 사실때문에 Vector3.left를 사용했습니다.
    void Move_Right()
    {
        transform.Translate(Vector3.left * Speed * Time.deltaTime);
        if (transform.position.x > 5f) transform.position = new Vector3(5f, 0f, 0f);
    }
   //왼쪽 움직임입니다.
    void Move_Left()
    {
        transform.Translate(Vector3.right * Speed * Time.deltaTime);
        if (transform.position.x < -5f) transform.position = new Vector3(-5f, 0f, 0f);
    }

    //자동으로 마구마구 쏩니다. 역시 Beam(총알)을 생성할때의 Performance 때문에 Coroutine사용!
    void Fire()
    {
        if (fire_last + fire_term > Time.time) return;
        StartCoroutine("Fire_Beam");
        fire_last = Time.time;
    }

    //이제 슬슬 주석다는게 지겨워 지려합니다. ㅡㅡ;; Coroutine땜시 있는겁니다.
    IEnumerator Fire_Beam()
    {
        Instantiate(beam, transform.position, Quaternion.identity);
        return null;
    }

   //적에게 부딪히면 사라지도록 설정. 역시 Coroutine
    void OnCollisionEnter(Collision col)
    {
        if (col.transform.tag != "enemy") return;
        StartCoroutine("Die");
    }

    //죽어야죠... ㅜㅜ
    IEnumerator Die()
    {
        Destroy(gameObject);
        return null;
    }
}

이 코드 역시 별게 없습니다.

마지막으로 총알인 Beam.cs파일입니다.


using UnityEngine;
using System.Collections;

public class Beam : MonoBehaviour {

    //총알 속도입니다.
    private float speed = 10f;

// 생성되면 위로 올라가면서 어느정도 갔을때 자동으로 없어지는게 애가 하는 일 전부입니다.
void Update () {
        Moving();
        AutoDie();
}

    //가자 위로!
    void Moving()
    {
        transform.Translate(Vector3.up * speed * Time.deltaTime);
    }

    //자동으로 없어지게.. 역시 Coroutine!
    void AutoDie()
    {
        if (transform.position.y < 6f) return;
        StartCoroutine("Die");
    }

    //죽어랏!!!
    IEnumerator Die()
    {
        Destroy(gameObject);
        return null;
    }
}


아~ 귀차니즘이 묻어나오는 주석이군요!
결과는 이러합니다.


사용자 삽입 이미지


2~3시간정도 걸린듯 싶네요. 소스작성부터 포스팅하는데 까지...
(가장 많은 시간은 파리 이미지 찾느라... 쿨럭..)

다음에는 Photon Cloud 붙여서 멀티플레이 만들어 보겠습니다. =)

2012/11/28 16:10 2012/11/28 16:10

트랙백 주소 :: 이 글에는 트랙백을 보낼 수 없습니다