728x90
반응형

카드 그림을 맞추는 게임을 만들어 보겠습니다

 

 

 

이게임은 고도의 집중력과  기억력이 요구되는 게임입니다

먼저 인터넷에서 게임에 쓰일 배경 이미지를 모읍니다

무료 배경 이미지를 인터넷에 들어가면 많이 찾을 수 있을 것입니다

 

 

 

먼저 Project 뷰에서 Resources 폴더를 만듭니다

 

 

인터넷에서 다운 배경 이미지 파일을 이름을 imgBack0~5까지 순번 되로 이름을 적습니다

이름 스팰링 하나 틀리면 안 되니 주의하여야 합니다

 

빈 오프젝트를 생성하고 이름을 BackManager 라 하고 메인 카메라와 라이트를 자식으로 둡니다 

 

 

 

그리고 GameObject -> 3D Object -> Plane을 하나 생성합니다

 

Plan의 이름을 Background1으로 하고 backManager 자식으로 둡니다

 

project 뷰에서 Materials 폴더를 만들고 Material을 생성합니다

 

 

 

Material의 이름을 back 1으로 합니다 

 

 

Background1을 선택하고 스케일을  2.3 ,1, 1.2로 하고 back 1 메터리얼을 드래그하여 붙입니다

그리고 Shader 속성을  Lefacy Shaders -> Transparent -> Diffuse를 선택하고 Resources 폴더에 있는  배경 이미지를  갖다 붙입니다 

 

 

 

 

Background1 오브젝트를 선택하여 Ctrl_D 키를 누르고 복사된 오브젝트를 이름을 Background2 라하고 Position  y 값을  -0.5를 줍니다

 

 

 

Project 뷰에서 Scrips 폴더를 만들고 BackManager 스크립트를 생성합니다

 

BackManager 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BackManager : MonoBehaviour
{
    //배경 이미지
    Transform back1;
    Transform back2;

    //오버랩 지연 시간
    int delayTime = 3;

    //현재의 시간
    float currentTime = 0;


    //이미지 갯수
    int imgCnt = 6;
    //현재 이미지 번호
    int imgNum = 1;

    void Start()
    {
        //배경찾기
        back1 = transform.Find("Background1");
        back2 = transform.Find("Background2");


    }
    // Update is called once per frame
    void Update()
    {
        //지연시간 처리
        currentTime += Time.deltaTime;

        if (currentTime >= delayTime)
        {
            currentTime = 0;

            //이미지 오버랩
            StartCoroutine(OverlapImage());
        }

    }

    IEnumerator OverlapImage()
    {
        //이미지 알파값 설정
        //이미지의 두명도는 0~1의 값이다 0은 완전 투명 , 1은 완전불투명
        for (float alpha = 1; alpha >= 0; alpha -= 0.05f)
        {
            //배경이미지를 점점 투명하게 만든다
            back1.GetComponent<Renderer>().material.color = new Vector4(1, 1, 1, alpha);

            //배경이미지를 점점 불투명하게 만든다
            back2.GetComponent<Renderer>().material.color = new Vector4(1, 1, 1, 1 - alpha);


            //화면 갱신까지 대기
            yield return new WaitForFixedUpdate();

        }

        //배경 바꾸기
        Transform tmp = back1;
        back1 = back2;
        back2 = tmp;

        //다음 이미지 준비
        //Mathf.Repeat() 0~<한계값-1> 을 반복으로 처리하는 함수
        imgNum = (int)Mathf.Repeat(++imgNum, imgCnt);

        //배경2에 새로운 이미지 할당
        back2.GetComponent<Renderer>().material.mainTexture = Resources.Load("imgBack" + imgNum) as Texture2D;

        currentTime = 0;
    }
}

 

 

 

BackManager 스크립트를  BackManager 오브젝트에 붙입니다

 

게임을 실행하면 아래 동영상과 같이 Resoceses 폴더에 들어 있는 이미지 imgBack0 ~1  순번대로 변환되는 것을 보실 수 있습니다 

 백그라운드 그림 이미지를 자연스럽게 바꾸는 방법을 살펴보았습니다 

 

반응형
728x90
반응형

마징가 제트는  가장 큰 특징은 뭐니 뭐니 해도 인간이 로봇에 탑승한다는 개념이다. 이는 70년대 일본에서 자동차가 상당히 고급 물품이었던 데다 자동차를 조종하는 기술이 특수한 기술로 여겨져 아무나 할 수 없는 동경의 대상으로 여겨진 시대상을 반영한다.

그리고 마징가 Z는 여기서 더 나아가 인간과 로봇이 일체화된다는 구성을 선보인다. 작중의 묘사를 보면 카부토 코우지는 단순히 마징가 Z에 올라타는 것만이 아니다. 마징가 Z의 위기가 곧 카부토 코우지의 위기이고, 코우지의 사망이 곧 마징가 Z의 불능화로 인식되고 있다는 점을 알 수 있다. 또 마징가 Z의 캐릭터성이 오직 코우지가 탑승한 것을 전제로 형성되고 있는 것도 함께 눈여겨 봐야 할 부분이다. 동서양을 통틀어 모든 SF에서는 로봇이란 독립된 캐릭터를 부여받기 때문에 마징가 Z의 묘사는 낯선 것이다.

코우지가 마징가 Z에 타는 것은 단순한 조종자가 되는 정도를 넘어서 마징가 Z라는 로봇의 "자아"가 된다는 뜻이고, 마징가 Z는 코우지의 새로운 육체가 된다는 것이다. 따라서 이것은 본질적으로 파일럿으로서 탑승하는 일이나 사이보그화 되는 것(인간이 기계가 되는 것)과는 근본적인 차이를 가진다. 마징가 Z와 코우지는 생물과 기계를 초월하여 양분되어서는 성립할 수 없는 동일시된 존재이라는 말이며, 이 점은 서구 SF계에서는 보기 힘든 철저히 동양적인 사고 관인 것이다. 이 때문에 서양에선 마징가 Z를 비롯한 일본의 거대 로봇 애니메이션을 일본에만 있는 것이라 하며 재패니즈 로봇, 쇼군 로봇이라고 따로 분류했을 정도였다.


작품 내에서도 이런 속성은 "부려지는 기계"인 기계수와 대비되며 더욱 뚜렷해진다. 일부 기계수는 나름대로 자아를 가지고 창조주인 닥터 헬에게 반항하기도 하지만, 그들은 어디까지나 "기계"이고 AI이다. 부여된 속성에 안주하고 거기에 충실할 뿐인 로봇이다. 인간이자 로봇인 마징가 Z는 그들이 지닌 기기묘묘한 능력에 대처하기 위해 스스로 성장하며 보다 완전한 존재로 거듭나게 되지만, 기계수들은 결국 성장하지 못한다. 이런 차이를 극적으로 표현한 에피소드가 제트 스크랜더의 등장이다.

마징가 Z의 수많은 강화극 중에서도 특히 제트 스크랜더가 고평가되는 것은 마징가 Z가 가진 근본적인 한계를 끝없는 향상심을 통해 극복하게 되는 것 때문인데, 여기서 기계수는 "하늘을 날 수 있는 이점" 때문에 한때 마징가 Z를 궁지로 몰아넣지만 단지 그렇게 부여된 속성 이상 아무것도 가지지 못하고 그 이상을 가지도록 노력할 수도 없는 존재이기 때문에 끊임없이 향상되는 마징가 Z 앞에서 결국 마지막에 무릎을 꿇을 수밖에 없다. 이런 개조극은 기계로서의 속성과 성장을 통한 인간 된 속성을 동시에 표현했던, 매우 인상적인 연출로 오늘날까지도 기계와 인간의 차이를 융합시킨 뛰어난 해답이라 평가할 수 있겠다.

나가이 고는 탑승형이란 개념을 착안한 것에 대해서 철인 28호 같은 조종형은 조종자가 안전한 곳에서 조종만 하는 것은 지도자가 젊은이 병사들을 전장으로 보내서 조종하는 현대전과 비슷한 맥락의 비겁한 느낌이기 때문에 배제하였고, 철완 아톰 같은 인공지능 로봇은 아무리 인공지능 기술이 발전해도 로봇은 인간보다 강한 육체를 가지고 있어 선민의식을 가지게 될 것이고, 이것은 곧 인간성의 결여로 이어진다고 생각해서 부정적으로 보았다. 나가이 고는 인간이 직접 탑승해서 목숨을 걸고 전장에 나가는 로봇을 만들어 인간성과 사람을 죽인다는 행위의 책임감을 강조하였고 "신도 악마도 될 수 있다" 라는 대사는 곧 싸움에는 책임을 지라는 의미라고 한다

 

 

마징가 제트를 3DS 모델링 하였습니다 

 정면 모습 

 

 

오른쪽 측면

 

 

 

뒷모습

 

 

왼쪽 측면

 

메탈 느낌의 렌더링을 좀더 공부를 해야겠습니다 ㅎㅎ

좀 더 멋진 모습으로 ㅎㅎ

 

 

걷기 동영상

 

 

 

마징가 제트 처럼 신나는 액션게임 

다운로드

https://play.google.com/store/apps/details?id=com.Magatron.MonsterSky

반응형
728x90
반응형

엽총의 표준 게이지는 2와 3/4인치 약실에 12, 16, 20 구경을 말한다.
1960년경만 해도 이 구경의 약실은 2.5인치였다. 이러한 구형 총들은 아직도 많이 사용되고 있다.
그러므로 구형엽총을 사용하는 사람들은 엽탄 선택에 세심한 주의를 기울여야 한다.
12 구경은 지름이 18.4mm인 엽총으로 세계적으로 가장 널리 사용되고 있는 총이다.
16 구경은 내부 지름이 17mm인 총으로 일부 층이 사용하고 있다.
20 구경은 16mm로 정교하고 세밀하여, 반동이 작은 총을 선호하는 사람이 애호한다.
12 구경은 유럽의 경우 32g 엽탄을 주로 사용하고 있으며 16 구경의 경우 28g, 20 구경의 경우 24g을 사용한다.
총의 무게도 구경이 작아 질수록 줄어든다. 즉, 12 구경은 2.9∼3.9kg, 16 구경은 2.6∼2.9kg, 20 구경은 2.4∼2.7kg이다.
따라서 구경이 작아질수록 총기를 다루기는 편하지만 성능은 떨어진다.
그러나 최근에는 기관부나 탄환장전장치를 알루미늄 합금으로 제조하는 기술이 개발되어 12 구경의 무게를 2.7kg 또는 그 이하로 감소시킨 총이 생산되고 있어 총의 무게에 대한 개념이 달라지고 있다.
16 구경이나 20 구경은 큰 멧돼지 사냥에는 효력이 떨어지기 때문에 바람직하지 않다. 보통 26∼28g의 산탄을 내뿜는 20 구경은 숲 속에서의 사냥과 근거리 사냥에 훌륭한 성능을 발휘한다.
물론 오리 사냥이나 기타 큰 게임의 사냥에도 적절하지 않다.
따라서 유럽지역에서는 12구경을 다기능 구경으로 인정받게 될 것으로 보이며 앞으로도 12 구경은 최고의 신뢰를 얻게 될 것으로 보인다.
12 구경 총은 24∼42g의 산탄을 뿜어낼 수 있는 총으로 거의 모든 상황에서 사냥하기에 적당한 것으로 보고 있다.
다만 화약이나 가스압력을 고려해 볼 때 30∼36g의 엽탄을 사용하는 것이 효과적이다.
탄환의 속도, 패턴, 명중도 등의 효력이 가장 높기 때문이다.
20 구경은 탐미적인 엽사들을 위해 그 특수성을 강화시켜 나가야 될 것으로 판단된다.
20 구경으로 가장 좋은 결과를 얻으려면 24∼28g의 엽탄을 사용해야 한다.

 

3D 맥스로 오브젝트 만들기

 

총열 개머리판 본체를 나누어  맵 피기 

 

 

 

포토샵에서 맵그림을 그리고 스탠더드 메터리얼에 맵을 씌웁니다

 

동영상을 올려봅니다 ㅎㅎ

독일 멜켈12구경 엽총

 

반응형
728x90
반응형

전 세계가 초토화되고 좀비들의 습격이 시작됩니다
미친 좀비들이 사정없이 공격하여 옵니다 
쳐들어 오는 좀비를 철조망이 무너지지 않게 좀비들을 무찌릅니다
좀비들을 없애면 랜덤으로 골드가 생성됩니다
생성된 골드를 획득하고 메인 요새 화면으로 돌아가 캐릭터를 강력하게 할 수 있는 무기를 구매합니다
총알도 강력하게 업그래드 할 총알을 구매할 수 있습니다
무기를 구매하여 포켓 지갑에 넣고 인간 요새를 지키기 위해 철조망을 사이에 두고 좀비들을 무찌릅니다
스테이지가 올라갈수록 좀비들의 숫자가 늘어나고 좀비들의 체력이 올라 감니다 
그리고 강력한 좀비 보스들이 출현 합니다 
화끈하게 좀비들을 쳐부술 수 있는 무기를 구해하여 좀비들을 없애고 스테이지를 올려 점점 강력한 좀비들과 대결을 하세요 
지구의 운명이 당신에게 있습니다 

구글 플레이 다운로드

 

마지막 남은 희망의 장소 인간의 기지를 지키는 주인공을 공격해 오는 좀비 떼들

 

철조망에 걸려든 좀비들 인간들에게 득달같이 달려듭니다

 

무시무시한 좀비들이 밤낮 가릴 것 없이 공격해오고 인간들은 강력한 보스 좀비의 공격을 막아 내야 합니다

 

게임 속에 캐릭터는 다양한 공격 무기를 탑재할 수 있습니다

좀비 떼의 공격을 막아내고 좀비들을 죽이면 금화가 생성됩니다

금화를 모아 캐릭터를 강화시킬 수 있는 강력한 무기와 탄약을 구입하세요

강력한 무기를 구입하면 더욱 게임을 즐겁게 즐길 수 있게 캐릭터를 강화시킵니다

 

화끈한 좀비 박멸로 좀비들을 철조망이 뚫리지 않도록 철조망을 보호하고 좀비들을 무찌르세요 

지구의 운명이 당신에게 있습니다 

 

구글 플레이 다운로드 

반응형
728x90
반응형

하이 라키 뷰에서 Gun 오브젝트를 선택하여 AddComponent -> Animation을 생성합니다 

 

 

하이 라키 뷰에 Gun 오브젝트를 선택하고  Window -> Animaton -> Animaton을 클릭합니다 

 

 

Animation 타임라인에서 Create 를 누르고  Assets에 Animation 폴더를 생성하고  파일 이름을 ChargeBullet으로 하여  저장합니다 

 

 

 

아래 동영상과 같이 타임 라인에 왼쪽 위에 빨간 버튼을 누르고 총이 왼쪽으로 회전 하는 애니메이션을 만듭니다

각각 타임라인에  라인 바를 갖다 놓고 총의 움직임을 주면선 애니메이션을 만듭니다

 

하이 라키 뷰에 Gun 오브젝트를 선택하고 자식으로 Cyilnder를 생성하고 position 0, 0.04, 0.251

Rotation 90, 0, 0   Scale 0.1, 0.15, 0.1로 맞춥니다 

총을 쏘았을 때 탄피가 튕겨 나오는 애니메이션을 할 수 있게 총안쪽에  보이지 않는 위치에 놓습니다 

 

 

 

Gun오브젝트의 Cylinder를 선택하고 window -> Animation -> Animation을 선택하여 빨간 버튼 아래에 있는 애니메이션 선택 바를 누르고 Create new Clip을 선택하여 애니메이션 이름을 Fire 하고 저장합니다 

 

 

 

 

 

그림과 같이 탄피가 나오는 애니메이션을 Cylinder를 타임라인에 움직이며 애니메이션을 줍니다 

 

Gun 오브젝트를 선택하고 Animation에 그림과 같이 애니메이션을 연결합니다 

Gun 오브젝트를 선택하고 자식으로 빈 오브젝트를 만들어 그림과 같이 총끝머리에 위치시키고 이름을 spPoint라고 합니다 차후에 총알 발사 위치와 총알 화염 이팩트가 터지는 위치입니다 

 

 

Gun 오브젝트를 선택하고 Gun Tag를 만들어서 Tag를 Gun으로 합니다  

 

 

 

source_effect.unitypackage
0.01MB

 

이팩트 소스를 다운로드하여 그림과 같이 Prefabs 폴더에 이팩트 파일을 저장합니다 

 

 

 

 

 

GunCtrl 스크립트 수정

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class GunCtrl : MonoBehaviour
{
    //총 발사음
    public AudioClip sndFire;
    //실탄 장전음
    public AudioClip sndCocking;
    //배경음악
    public AudioClip sndStage;
    //게임 오버음
    public AudioClip sndOver;

    //프리팹 접시,참새, 폭파화염,총구화염, 총알
    public Transform clay, bird, exp, gunFire, fireBullet;

    //탄피,총구위치
    Transform bulletCase, spPoint;

    //실패 횟수
    static public int miss;

    //성공횟수
    int hit;

    //남은 총알
    int bulletCnt;

    //시작시간, 종료시간
    float startTime, overTime;
    bool gameOver = false;

    //화면폭과높이
    int width, height;

    void Start()
    {
        Screen.orientation = ScreenOrientation.Landscape;
        Screen.sleepTimeout = SleepTimeout.NeverSleep;

        Cursor.visible = false;

        SetStage();
    }
    private void Update()
    {
        // 10번 미스 되면 게임 오버
        if (miss >= 10)
        {
            gameOver = true;
            overTime = Time.time;
        }

        if (gameOver)
        {
            return;
        }

        // Esc 누르면 게임종료
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            EditorApplication.isPlaying = false;
        }

        MakeClay();
        RotateGun();

        if (Input.GetMouseButtonDown(0))
        {
            FireGun();
        }
        if (bulletCnt < 5 && Input.GetMouseButtonDown(1))
        {
            StartCoroutine(ChargeGun());
        }

    }

    //총회전 
    void RotateGun()
    {
        //카메라부터 거리를 설정
        Vector3 pos = Input.mousePosition;

        //화면의 기준으로 총의 움직임을 제한한다
        pos.x = Mathf.Clamp(pos.x, 0, Screen.width);
        pos.y = Mathf.Clamp(pos.y, 0, Screen.height);

        //카메라로 부터의 거리
        pos.z = 13.2f;
        //마우스 위치를 월드 좌표로 변환
        Vector3 view = Camera.main.ScreenToWorldPoint(pos);

        //총의 회전
        transform.LookAt(view);

    }

    void FireGun()
    {
        //실탄 장전 애니메이션이 진행중이면 발사금지
        if (GetComponent<Animation>().isPlaying)
        {
            return;
        }

        RaycastHit hit;

        //카메라 시점에서 커서 위치 계산
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Physics.Raycast(ray, out hit, Mathf.Infinity);

        //총을 클릭하면 실탄 재장전
        if (hit.transform.tag == "Gun" && bulletCnt < 5)
        {
            StartCoroutine(ChargeGun());
            return;
        }

        //총구 앞에 화면
        Instantiate(gunFire, spPoint.position, Quaternion.identity);
        //총탄 발사 
        Instantiate(fireBullet, spPoint.position, spPoint.rotation);
        //탄피 배출 애니메이션
        GetComponent<Animation>().Play("Fire");

        CheckTarget(hit);

        //남은 실탄 수 처리
        bulletCnt--;
        if (bulletCnt<= 0)
        {
            StartCoroutine(ChargeGun());
        }
    }

    //목표물 적중여부 판정
    void CheckTarget(RaycastHit hit)
    {
        switch (hit.transform.tag)
        {
            //접시 명중되었을 때 점수 처리및 폭발이팩트 생성및 제거
            case "Clay":
                this.hit++;
                Instantiate(exp, hit.transform.position, Quaternion.identity);
                Destroy(hit.transform.gameObject);
                break;

                // 참새 사망시 미스 처리및 참새연결 스크립트의 DeadBird 함수 와 통신 
            case "Bird":
                Instantiate(gunFire, hit.transform.position, Quaternion.identity);
                miss++;
                hit.transform.SendMessage("DeadBird", SendMessageOptions.DontRequireReceiver);
                break;

        }
    }

    //장전 애니메이션 
    IEnumerator ChargeGun()
    {
        while (GetComponent<Animation>().isPlaying)
        {
            yield return 0;
        }

        GetComponent<Animation>().Play("ChargeBullet");
        yield return new WaitForSeconds(0.5f);
        bulletCnt = 5;
    }

    //접시 생성
    void MakeClay()
    {
        if (Random.Range(0, 1000) > 970 && !GetComponent<Animation>().isPlaying)
        {
            if (Random.Range(0,100)< 70)
            {
                Instantiate(clay);
            }
            else
            {
                Instantiate(bird);
            }
        }
    }

    //장전 음악 
    void SoundClick()
    {
        bulletCase.gameObject.GetComponent<Renderer>().enabled = true;
        AudioSource.PlayClipAtPoint(sndCocking, Vector3.zero);
    }

    //탄발사음 
    void SoundFire()
    {
        bulletCase.gameObject.GetComponent<Renderer>().enabled = true;
        AudioSource.PlayClipAtPoint(sndFire, Vector3.zero);
    }

    //탄피 감추기 애니메이션
    void HideBullet()
    {
        bulletCase.gameObject.GetComponent<Renderer>().enabled = false;
    }
    void SetStage()
    {
        width = Screen.width;
        height = Screen.height;

        spPoint = GameObject.Find("spPoint").transform;

        bulletCase = transform.Find("Cylinder");

        bulletCase.gameObject.GetComponent<Renderer>().enabled = false;

        startTime = Time.time;
        hit = miss = 0;
        bulletCnt = 5;
        gameOver = false;

        GetComponent<AudioSource>().loop = true;
        GetComponent<AudioSource>().Play();
    }

    void OnGUI()
    {
        // GUI.skin = skin;

        //게임진행시간 
        float time = Time.time - startTime;

        if (!gameOver)
        {
            //커서위치에 조준점 표시
            GUI.DrawTexture(new Rect(Input.mousePosition.x - 24, height - Input.mousePosition.y - 24, 48, 48),
                            Resources.Load("crossHair") as Texture2D);
        }
        else
        {
            time = overTime - startTime;
        }

        //남은 실탄수 표시
        for (int i = 1; i <= bulletCnt; i++)
        {
            GUI.DrawTexture(new Rect(i * 12, height - 20, 8, 16), Resources.Load("bullet") as Texture2D);
        }

        //점수 등 표시
        string sHit = "<size='30'>HIT : " + hit + "</size>";
        string sMiss = "<size='30'>MISS : " + miss + "</size>";
        string sTime = "<color='yellow'><size='30'>Time : " + (int)time + "</size></color>";

        GUI.Label(new Rect(30, 20, 120, 40), sHit);
        GUI.Label(new Rect(width / 2 - 40, 20, 160, 40), sTime);
        GUI.Label(new Rect(width - 120, 20, 120, 40), sMiss);

        string msg = "Shoot : Left Btn  Charge : Gun Click";
        GUI.Label(new Rect(width - 380, height - 40, 380, 40), msg);

        //게임오버 처리
        if (gameOver)
        {
            Cursor.visible = true;
            if (GetComponent<AudioSource>().clip != sndOver)
            {
                GetComponent<AudioSource>().clip = sndOver;
                GetComponent<AudioSource>().loop = false;
                GetComponent<AudioSource>().Play();
            }

            //Play Game 버튼 생성 및 버튼On 시 게임다시 진행
            if (GUI.Button(new Rect(width / 2 - 70, height / 2 - 50, 140, 60), "Play Game"))
            {
                Application.LoadLevel("MainGame");
            }

            //게임에서 나옴
            if (GUI.Button(new Rect(width / 2 - 70, height / 2 + 50, 140, 60), "Quit Game"))
            {
                EditorApplication.isPlaying = false;
            }
        }
    }
}

 

 

 

 

 

 

 

 

GunCtrl 스크립트를 작성하고   Sound 파일에 있는 음악 소스 파일을 그림과 같이 연결합니다 

 

Prefabs파일에 있는 프리 팹을 GunCtrl 스크립트에 연결합니다 

 

 

Gun 오브젝트를 선택하고  AudioSource를 만들어서 AudioClip에 Stage 파일을 연결합니다

 

 

 

 

 

 

 

Gun오브젝트를 선택하고 애니메이션 타임라인을 열고 애니메이션 타임라인 3/2 되는 지점에 애니메이션 이벤트를 만들어서 Function을 SoundClick() 함수에 연결합니다 

 

Fire 애니메이션을 선택하고 첫 타임라인에 SoundFire() 함수를 연결하는 애니메이션 이벤트를 만듭니다 

 

Fire 애니메이션 마지막 타임 라인에 HideBullet() 함수를 연결하는 애니메이션 이벤트를 만듬니다 

 

ClayCtrl 스크립트를 열고 아래 그림과 같이 GunCtrl.miss++; 를 추가합니다 

 

 

 

 

 

 

 

 

아래 동영상과 같이 총쏘는 게임을 만들어 보았습니다 

여기까지 따라 오신분들 너무 수고 많으셨습니다

감사해요 ㅎㅎ

 

반응형

+ Recent posts