::キー入力(上下左右)で動く

youtu.be/5nzEYsQzBNw

>>改善すべき:もっと自然な数値(数式)設定?

using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using UnityEngine;

public class HeroA : MonoBehaviour
{
    // :: Variables : Easy to Use
    private CharacterController controller;
    private Animation anim;
    // :: Enums : Animation Key
    private enum eAnimation
    {
        [Description("idle@loop")]
        IDLE,
        [Description("run@loop")]
        RUN,
        [Description("walk@loop")]
        WALK
    }


    // Start is called before the first frame update
    void Start()
    {
        // :: Easy to use for : CharacterController
        controller = this.gameObject.GetComponent<CharacterController>();
        // :: Easy to use for : Animation
        anim = this.gameObject.GetComponent<Animation>();
    }

    // :: for use enum Description
    private string GetEnumDescription(eAnimation value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());
        var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        var descriptionString = attributes.Select(ele => ele.Description).FirstOrDefault();

        if(descriptionString != null)
        {
            return descriptionString;
        }
        return value.ToString();
    }

    // Update is called once per frame
    void Update()
    {
        // :: 1.1 Input key (up, down) check
        float forwardInput = Input.GetAxisRaw("Vertical");

        // :: 2 Rotate with key (left, right) check
        float rotateInput = Input.GetAxisRaw("Horizontal");
        this.transform.Rotate(Vector3.up * rotateInput * 0.5f);

        // :: 3# Change Animation
        // ::: Run
        if (forwardInput != 0)
        {
            anim.Play(this.GetEnumDescription(eAnimation.RUN));

            // :: 1.2 Move forward and Backward
            this.controller.Move(this.transform.forward * forwardInput * Time.deltaTime);
        }
        // ::: Just Rotate
        else if(rotateInput != 0){
            anim.Play(this.GetEnumDescription(eAnimation.WALK));
        }
        // ::: No Move
        else
        {
            anim.Play(this.GetEnumDescription(eAnimation.IDLE));
        }


        //this.transform.Rotate(0, 1, 0);
        //controller.Move(this.transform.forward * 0.01f);
    }
}
블로그 이미지

RIsN

,

【공모전】 : LEGO x Unity Micro Game

【프로젝트명】 : Blockfall

  • Waterfall(폭포)와 비슷한 어감

【게임】 : 하러가기

 

【목표】 : 최우수상

【결과】 : 진행중

 

【간단 설명】 : 연동되어 떨어지는 블록을 넘어 닭을 구출

【컨셉】

  • 고전 레고
  • 구출 스토리
  • 최대한 자극적, 폭력적, 경쟁적이지 않을 것
  • 난이도 하 ⇒ 난이도 중

【레퍼런스 게임】 : 없음

 

【현 상황:2020-11-16】 : 완료

youtu.be/IV6Fteb04gE

 

【리미트 설정】

  1. 레고 스크립트의 수정 없음
  2. 타 에셋 사용 없음

【구현 설계】

  1. 2차원 [2][2] 블록 맵 작성 : 완료
  2. [0][0]을 스타트 지점으로 [1][1]을 트로피 지점으로 작성 : 완료
  3. PlayerPrefs에 현재 스테이지를 저장, 트로피를 얻으면 승리 화면 : 완료
    1. 기존 튜토리얼 Scene을 수정해서 사용 : 완료
  4. 승리 화면에서 NextStage 버튼을 누르면 현재 스테이지 +1 상승 후 다시 Main 씬 로드 : 완료
  5. 현재 스테이지에 맞춰서 2차원 블록 맵이 확장 : 완료
  6. 밟으면 블록이 떨어져 제거
    1. 밟은 블록 확인 : 완료
    2. (테스트) 밟은 블록 색깔 변화 : 완료
    3. 새로이 색깔 변화 스크립트를 만들어서 블록에 붙임 : 완료
    4. 블록이 떨어져 제거 : 완료
  7. 2개의 블록 링크 및 링크된 블록 색깔 변화 : 완료
  8. :: [BUG] : 스테이지 재 로드 시 블록이 분해되어 작동 안함 : 해결 완료
    1. 블록 스크립트를 만들어서 Prefab에 저장? or Touch 블록을 사용해서 스크립트 실행이 되나 확인? : 실패
    2. Prefab에 LEGO Behaviour Block을 붙임 : 성공
      1. 해결 과정 : Behaviour Block이 붙어있는 것은 재 로드시 분해되지 않는 결과가 있었기에 그것을 활용
  9. 스타트 블록과 마지막 블록을 제외하고 모든 블록 링크 : 완료
  10. 링크 블록 같이 떨어져 제거 : 완료
  11. 최종 스코어 저장 : 완료
  12. 실패 시 PlayerPrefs 초기화 및 첫 스테이지부터 시작 : 완료
    1. :: [방향 수정] 하드코어 스테이지 작성, 하드코어 스테이지 이상일 시 다시 하드코어 스테이지 처음으로 초기화 : 완료
  13. 난이도 조절
    1. Enemy Low : 완료
    2. Enemy Mid : 완료
    3. Stage 7 이후 대각선 제거 : 완료
    4. Enemy High : 완료
      1. 닿으면 플레이어를 부수는 레고 캐릭터(하자드) : 완료
    5. BOSS, 거대 보스, 3개의 트로피도 모두 획득하라? : 완료
      1. :: [방향 수정] 보스만 존재 : 난이도 중하 : 완료
  14. 프로젝트 정리 및 코드 정리 : 완료
    1. In Game의 Touch the object를 Touch & Save the Chicken으로 변경 : 완료
    2. 한글화 : 완료
  15. <I want Elsa Lego!!!>가 들어간 Credit 만들기 : 스킵
  16. 승리 / 패배 씬 작성 : 완료
    1. :: [컨셉] 친구 닭들을 구하는 기사
  17. 레고를 사용한 심플 이펙트 설치 : 완료
  18. 4.11f로 다운그레이드 : 완료
  19. BGM  : 완료
  20. QA : 완료
  21. 빌드 및 제출 : 완료

 

【스크립트 구조】

Scripts.zip
0.03MB

 

 

Dictator(총괄)
: 사라지지 않음, 중복 불가
: 씬의 이동과 초기화를 관리

[Scene]_Ruler
: 씬의 지배자
: 기본적인 움직임과 시나리오, 각 치프들은 룰러가 지배함

[Scene]_GOCheif
: 씬의 UI를 제외한 것들의 움직임을 관리하는 팀장
: 다만 움직임을 설정만 해서 룰러에게 제공할 뿐, 실제로 움직이는 것은 룰러의 일

[Scene]_GOHolder
: 씬의 UI를 제외한 것들의 GameObject를 보관하고 있는 홀더

[Scene]_UIChief
: 씬의 UI의 움직임을 관리하는 팀장
: GOChief랑 거의 하는 일은 같음

[Scene]_UIHolder
: 씬의 UI GameObject를 보관하는 홀더

// [그 외 스크립트]
: 각 독립 오브젝트들의 움직임을 관리 : 룰러의 지배를 받지 않음 : 효용성과 구조에 대한 고찰 필요

【해당 프로젝트로 학습한 사항】

  • 스크립트 구조에 대한 설계
    • 움직이는 관리자(치프)와 갖고 있는 홀더를 나누고, 그 관리자를 지배하는 시나리오 메이커(룰러)와 모든 씬을 총괄하는 총괄(딕테이터)을 놓아 두는 구조
    • 장점 : 어디서 문제가 생기는 지, 코드를 다시 보았을 때 구조에 대한 이해가 빠름
    • 현재 개선점 : 독립적인 부분 등에 대한 관리가 필요
  • 작성한 스크립트가 아닌 타 스크립트와의 연계
블로그 이미지

RIsN

,

>> 캐릭터 Citizen을 사용해서 Lego 움직임과 비슷하게 하기

:: 우선 정리 필요

블로그 이미지

RIsN

,