본문 바로가기
Unity Boot Camp

Udemy STARTERS (유데미 스타터스) Unity 취업 부트캠프 21주차 - Among Us 기능 추가

by 개발하는 디토 2022. 11. 13.

임포스터의 Vent 이동 기능을 추가했다. 

 

 

Vent 이동

Player Prefab에 Animation 추가

  1. Create New Clip으로 VentIn 애니메이션을 생성한다.
  2. AU_Player의 자식으로 있는 Player의 Position을 조절한다.
    Player Position
    • 10 Frame : Position Y 1
    • 30 Frame : Position Y -1
  3. AU_Player의 자식으로 있는 Player의 Is Active
    Player Is Active
    • 30 Frame : 체크 해제
  4. AU_Player의 Sphere Collider-Enabled, Capsule Collider-Enabled
    AU_Player Capsule Collider
    • 30 Frame : 체크 해제
  5. 만든 Animation의 Loop Time 해제

Loop Time 해제

 

 

결과

 

 

Animation 연결

  1. Vent In 복사해 Vent Out 만든다.
    Vent 나오기는 Vent In을 복사해서 Speed만 -1로 바꿔줌으로써 역순 재생
    Vent Out: Speed -1
  2. Parameter isVented 만들고 Transition 조건 달아준다.
    • isVented true : Any State → VentIn
    • isVented false : VentIn → Vent Out
    • VentOut → Idle : Has Exit Time에 의해 VentOut 애니메이션 끝나면 자동으로 이동하게끔
      Any State -> Vent In: Has Exit Time 체크 해제
  3. Any State에서 VentIn으로 가는 Transition의 Can Transition To Self를 꺼주어야 애니메이션이 게속 진행되지 않음.

 

Animation 동기화

AU_Player의 Photon Animator View - Synchronize Parameters에서 isVented Discrete로 변경

 

 

Vent 생성

  • Interactable Object 생성 후 적절한 Sprite 연결
  • 자식인 Highlight에도 부모와 같은 Sprite 연결, 붉은색 Material 만들어 연결
  • Vent 눌렀을 때 나와야 할 Panel 제작해서 연결

 

결과

 

Vent 이용 시 나와야 할 화면 제작

 

  1. AU_Vent.cs 작성
  2. UI - Image - 화살표 Sprite 추가 후 Prefab으로 만듦
  3. Canvas - Panel 3개 생성
    • 각 Panel에 화살표 2개, Exit용 버튼 1개
  4. 만든 화살표 Prefab에 Button component, AU_Vent.cs 추가
      • OnClick() → AU_Vent.ChangeVent() 연결
      • Current Panel에 현재 Vent에서 보여줄 화면 연결
      • Next Panel에 각 화살표 버튼 눌렀을 때 다음으로 보여줄 화면 연결
      • Next Pos에 다음 Vent 위치 연결
  5. Vent 나가기 버튼
    • OnClick() → AU_Vent.cs 연결된 화살표 오브젝트 연결
    • OnClick() → AU_Vent.GetOutVent() 연결
  6. Vent 들어갈 때 임포스터의 이름을 꺼주고 Vent 나올 때 임포스터의 이름을 다시 켜준다.
    • Canvas - Is Active 추가 - 0 Frame : 체크 / 30 Frame : 체크 해제
    • VentOut은 역순으로 재생되므로 Vent 나올 때는 이름 돌아옴

AU_Vent.cs

더보기

화살표 버튼에 ChangeVent()를 연결해 버튼 누를 때마다 Vent를 통해 이동한 것처럼 플레이어 위치를 옮기고 새로운 장소에 맞는 next Panel을 꺼낸다.

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

public class AU_Vent : MonoBehaviour
{
    [Header("Vent Movement")] 
    [SerializeField] GameObject currentPanel; 
    [SerializeField] GameObject nextPanel; // after movement
    [SerializeField] Transform nextPos; // position to move

    public void ChangeVent()
    {
        currentPanel.SetActive(false);
        nextPanel.SetActive(true);
        AU_PlayerController.localPlayer.transform.position = nextPos.position;
    }

    public void GetOutVent()
    {
        currentPanel.SetActive(false);
        AU_PlayerController.localPlayer.ExitVent(); // isVented -> false
    }
}

 

AU_PlayerController.cs

더보기

Imposter일 때 Vent를 클릭하면 현재 Vent의 Trigger에 닿아있는지 확인한 뒤 닿아있다면 Vent의 하이라이트를 꺼주고, Vent로 들어가는 애니메이션을 재생한다. 키보드 움직임은 제한한다.

Vent 나가기 버튼에 연결하는 ExitVent()는 Vent 빠져나오는 애니메이션을 재생하고 다시 키보드 움직임을 활성화한다.

private void Interact(InputAction.CallbackContext context)
{
    if (pv.IsMine)
    {         
        if(context.phase == InputActionPhase.Performed)
        {
            // 캐릭터 겹치는 경우 대비해 RaycastAll로 전부 다 받기
            Ray ray = myCamera.ScreenPointToRay(mousePos);
            RaycastHit[] hits = Physics.RaycastAll(ray, interactLayer);
            foreach (var hit in hits)
            {
                if (hit.transform.tag.Equals("Interactable"))
                {
                    //Debug.Log(hit.transform.name);
                    if (!hit.transform.GetChild(0).gameObject.activeInHierarchy)
                        return;
                    AU_Interactable temp = hit.transform.GetComponent<AU_Interactable>();
                    temp.PlayMiniGame();
                }

                // Vent
                if (isImposter && hit.transform.tag.Equals("Vent"))
                {
                    //Debug.Log(hit.transform.name);
                    if (!hit.transform.GetChild(0).gameObject.activeInHierarchy)
                        return;
                    AU_Interactable temp = hit.transform.GetComponent<AU_Interactable>();
                    temp.highlight.SetActive(false);
                    temp.PlayMiniGame(); // show panel

                    Move.Disable(); // block movement
                    animator.SetBool("isVented", true);
                }
            }
        }
    }

}

public void ExitVent()
{
    animator.SetBool("isVented", false);
    Move.Enable();
}

 

 

혼자 공부

RPC 동기화 가능한 데이터 타입 정리

 

[Unity] Photon Serialization - RPC 동기화 가능한 데이터 타입

Photon에서 RPC를 통해 동기화할 때나 PhotonSerializeView를 통해 동기화할 때나 동기화할 수 있는 데이터 타입에 제한이 있다. 특히 Photon을 사용할 때 게임 오브젝트 자체를 동기화하려고 하면 안 되는

psych-dobby.tistory.com

알고리즘 공부

 

[백준] 10816 C# 숫자 카드 2

문제 숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로

psych-dobby.tistory.com

 

 

[백준] 1920 C# 수 찾기

문제 N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오. 입력 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의

psych-dobby.tistory.com

 

다른 사람과 동기화되는 미니게임 만들었다.

 

 

[Unity] 어몽어스 미니게임 (멀티) - 스위치 켜기 (Among Us - Light Switch task Multi ver)

스위치 켜기는 어몽어스 게임 중 임포스터가 크루를 방해하기 위해 암전시켰을 때 수행하는 임무이다. 개인 미션이 아닌 크루 중 누구라도 완수하면 모두가 오나수한 것처럼 인정되는 공용 임

psych-dobby.tistory.com

 

Card Swipe Game 만들고 Mission System 만들었다.

 

 

 

후기

지난주부터 절절매던 Multi용 미니게임을 만들었다...! 인간 승리다. 만들면서 Photon 시스템에 조금씩 적응해가는 느낌이다.

어몽어스를 학부원생 vs. 교수의 대결 게임으로 개편 중이다. 미션 시스템을 만들었고 이제 임포스터가 아닌 교수가 손가락을 딱 튕기면 대학원생의 모든 미션은 초기화되게 할 예정이다 크하하하.... 너무 악마 같은가? 어쩔 수 없다. 그것이... 대학원생이니깐...! 이거 잘 만들어서 주변 대학원생들한테 뿌리고 싶다.

다음주부터 새로운 거 한다는데 기대가 된다.

 

 

유데미코리아 바로가기 : https://bit.ly/3b8JGeD

본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.

 

새로운 가능성의 시작, 유데미 x 웅진씽크빅

글로벌 최신 IT 기술과 실무 교육을 입문부터 심화까지! 프로그래밍, 인공지능, 데이터, 마케팅, 디자인 등 세계 최고의 강의를 경험하세요.

www.udemykorea.com

댓글