ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (19) 싱글플레이용 아이템 추가 제작
    Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 6. 1. 04:10

    싱글플레이를 제작하면서 계속 느꼈던게 있었다

     

     

    최종적으로 완성한 7가지의 아이템들. 근데 이 아이템들은 모두 멀티플레이를 개발할때 제작했던 것들이라 아무래도

    아이템의 결이 멀티플레이에 더 적합한 느낌이다. 

     

    특히 싱글플레이를 할수록 느끼는게 몇몇 아이템들을 정말 게임에 아무런 영향도 끼치질 못한다

    그래서 이번엔 싱글플레이용 아이템들을 몇개 제작하고 아닌것들은 싱글플레이에서 쳐내는걸로 하겠다

     

     

    우선 위 3개의 아이템은 싱글플레이에서 제거하도록 하겠다

     

    물론 아이템을 발사하는 이 적 유닛에게는 적용되지 않는다. 

    말이 나온김에 이 유닛은 특수유닛이 아닌 일반보스로 분류되었다. 아무리봐도 일반 유닛의 스펙이 아닌것같다

     

    이제 새로운 아이템을 만들어보자. 당연히 지금 만든 아이템은 멀티플레이에도 적용될 예정이다

     

    1. 2배 데미지 아이템

    2. 멈추지 않는 아이템 - 분홍

    3. 초소화 아이템 - 주황

    4. 수류탄 - 남색&파랑

    5. 터렛 - 남색 & 파랑

     

    내가 봤을때 아이템을 추가로 만들때 가장 골치 아픈것은 각각의 기능구현이 아니라

    기존에 만들어놓은 시스템에 얘네들을 전부 추가하고 적용시키는것이다

    그렇기 때문에 모든 순서를 전체가 다같이 하며 단계를 이동하는걸로 하겠다

     

     

    아이템 디자인이다. 특히 4번째 저 3분할 화살표 아이콘은 아무리 찾아도 안나와서 직접 만들었다

     

    자 이제 기존 시스템에 이 5가지의 아이템들을 녹여보자

     

    우선 일정 시간이 될때마다 맵에 하나씩 생성될 Generate 역할을 아이템들과 

    똑같은 컴포넌트를 붙여주었다

     

    태그들도 만들어준뒤 5개의 새로운 아이템들에게 부착해주자

     

    이번엔 랜덤으로 생성될 아이템 목록에 새로운 5가지 아이템들도 추가해주겠다

     

    잘 생성이 되는것을 확인할 수 있다.

     

    그럼 이제 다음단계는 저걸 먹었을때 아이템 인벤에 아이콘이 떠야한다

    아이콘은 이런식으로 다 노가다해서 기존 버튼들과 사이즈를 맞추어주었다

     

    왜인지는 몰라도 이미지 미리보기가 뜨질 않아 더 귀찮아진것도 있었다

    물론 이 버튼들도 전부 태그를 알맞게 걸어두었다

     

    그 다음은 아이템을 먹었을시 해당 아이템 아이콘을 인벤에 띄워주는 코드에 있는 P1 Icon 배열을 다 없애주고

    처음부터 다시 전부 넣어준다

     

    코드도 전부 수정해주자. 이럴줄 알았으면 태그명 좀 짧게 짤걸 그랬다

     

    자 거의다 왔다. 이제 아이템 아이콘을 클릭하면 실전에 쓰일 구체를 발사하기만 하면 된다

     

     

    한번 더 발사용으로 쓰일 프리팹을 만들어준뒤 

     

    똑같이 발사 프리팹을 관리하는 스크립트에 다시 부착해준뒤 코드를 수정해주면 끝

     

     

     

    랜덤생성, 아이콘 클릭, 발사 3가지 모두 잘 이루어지는것을 확인해볼수 있다

    영상에서는 임시로 기본 코드인 BallController를 넣어서 저렇게 보이는데 이제 5가지의 아이템들을 

    하나하나 기능구현을 해보도록 하겠다

     

    아 근데 실수한게 하나 갑자기 생각났다. Twice와 Small은 빨간색이 아니라 플레이어 총알 색상에 맞춰

    파란색으로 해야한다는거.... 급하게 수정해주었다

     

    ----------------------------------

     

    자 이제 모든 준비가 다 끝났으니 아이템 기능 구현을 해보도록 하자

    사실 이 글을 쓰고 있을 시점에는 모든 기능구현과 결정이 다 끝난 상태이기에 결론부터 말하겠다

     

     

    밑에 두 아이템은 최종적으로 게임에서 제거하는걸로 하겠다

    우선 가장 큰 이유는 두 아이템 모두 아이템 자체에서 새로운 총알을 생성한다는것이 문제였다

     

    문제는 이 총알이 적 총알이 아니라 내 총알이라는건데 알다시피 내 총알이 내 데드존에 닿아버리면

    게임이 패배판정으로 이어지기 때문에 너무나도 안좋은 변수들이 많았다

    물론 다른 속성의 총알을 새로 만들어줄수도 있겠지만 그건 너무 과해질뿐이다

     

    두번째 이유는 아이템의 개수가 너무 많아진다는것. 나야 개발을 하는중이니 그렇다쳐도

    이걸 처음 게임해보는 사람이 한다고 쳤을때 

    싱글플레이용 아이템이 9개, 멀티플레이용만 10개니 너무 산만해질 수 있다

     

    그렇기에 위 3개의 아이템만 최종 사용하기로 결정하였으니 이제 기능구현을 해보자

     

    사실 사이즈가 작게 발사되는 Small이나 한번의 충돌로 2번의 데미지를 주는 Twice는 따로 스크립트를 만들만큼

    복잡한 기능이 없다. 

     

    실제로 기본 구체발사&팽창 스크립트인 Ball Controller가 부착되었고 태그도 아이템이 아닌 기본 P1ball이다

     

    일단 Small은 따로 적을것도 없다. 그냥 기본 구체 사이즈만 줄여주고 폰트 사이즈만 조절해주면 끝. 

     

    두배의 데미지를 주는 Twice같은 경우 코드보다는 다른곳에서 살짝 손을봐 기능을 구현해주었다

     

     

     

    기본 구체를 컨트롤 하는 BallController의 일부. 

    정말 간단하다. 충돌이 일어나 내구도가 떨어질때 만약 충돌한 오브젝트의 이름이 SPTwiceF(Clone)이라면

    내구도를 한번더 닳게 하여 총합 2의 내구도가 까이게 만들었다

     

    마지막 아이템은 Endless. 이름 그대로 절대 멈추지 않으며 인게임 화면안을 끊임없이 이동한다

    속도는 일정하고 충돌이 일어난다면 변화가 생길수 있다

    내 데드존에 닿는다고 패배판정이 일어나진 않지만 그렇다고 적유닛에게 데미지를 입힐수도 없다

     

    말그대로 인게임에 있는 구체들을 정리해주는용 아이템이다.

    게임속 구체가 12개가 넘어가버리면 패배판정이 되버리는 새로운 게임룰이 생겨버렸으니

    밸런스를 위해 필요한 아이템이다. 게다가 한번 날리면 절대 게임에서 사라지지 않는다는 장점이 있으니

    아이템만 빨리 획득한다면 중간보스도 해볼만 할것이다

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Endless_Skill : MonoBehaviour
    {
    
        public float speed = GameManager.shotDistance; 
        private Rigidbody2D rb;
        private Vector2 lastVelocity;
    
        void Start()
        {
            rb = GetComponent<Rigidbody2D>();
            rb.gravityScale = 0;
            rb.velocity = GameManager.shotDirection * speed;
        }
    
        void FixedUpdate()
        {
            lastVelocity = rb.velocity;
        }
    
        void OnCollisionEnter2D(Collision2D collision)
        {
            Vector2 normal = collision.contacts[0].normal;
            Vector2 reflectDirection = Vector2.Reflect(lastVelocity.normalized, normal);
    
            rb.velocity = reflectDirection * speed;
        }
    }

     

    해당 아이템을 구현하는 코드이다. 당연히 BallController에서 가져와 전체적으로 수정해주었고

    한번 날리면 절대 속도가 줄어들지 않음과 동시에 reflect로 반사시 속도가 줄어들지 않도록 구현해주었다

     

    이 아이템 역시 태그가 Item이기 때문에 이걸로 다른 아이템을 획득하는것 역시 가능하다

    문제는 Item태그가 달린 오브젝트가 내 데드존에 닿으면 게임이 종료되게 되는데 이건 막아야한다

     

    데드존에 부착된 P1Deadzone. 보통 다른 아이템들은 isExpand를 해당 오브젝트의 hasExpanded정보를 가져와

    해당 구체의 팽창유무를 정하는 isExpand가 false라면 패배판정이지만 SPEndlessF같은 경우는

    무조건 isExpand를 true로 만들어 게임패배판정이 일어나지 않도록 해주었다

     

     

    아이템으로 다른 아이템은 먹지만 데드존에 닿아도 게임패배가 일어나지 않는것을 확인할 수 있다

     

Designed by Tistory.