Unity에서 게임을 일시 중지하고 싶습니다.

4708 단어 C#Unity

이 기사에 대하여



이 기사는 자신의 비망록적인 내용입니다.

하고 싶은 일



Unity에서 일시정지를 할 수 있게 되고 싶다.
그 중에서 TimeScale=0;이라는 방법에 대해 정리해 둡니다.

결론


  • TimeScale=0으로 함으로써 게임 진행을 멈출 수 있다
  • 멈추고 싶지 않은 처리는 Update 함수에, 멈추고 싶은 처리는 FixedUpdate 함수에 넣는다
  • Update 함수의 처리를 멈추고 싶다면 deltaTime을 곱한다.

    TimeScale이란?



    Unity 공식

    Time.timeScale은 시간 경과 속도입니다.
    1이 기준이 되고, 1보다 작으면 시간 경과가 느려지고, 1보다 크면 시간 경과가 빨라집니다.

    시험에 좌우의 벽에 부딪히는 공을 준비해 그 속도를 바꾸는 버튼을 준비해 보았습니다.


    실제로 움직여 본 동영상입니다.


    과연 이것으로 일시 정지를 만들 수 있군요! ! !



    그렇게하지 않았습니다.

    불완전한 점



    우선, 이 시간을 정지시키는 방법입니다만 Update 함수는 살아 있습니다.
    모든 것이 동작 불가가 되면 아무것도 할 수 없게 되니까요 (메뉴 화면을 열거나 되돌리거나 할 수 없게 되면 의미가 없다).

    이로 인해 움직이지 않는 것은 시간이 관련된 처리입니다.
    * FixedUpdate 함수 내의 처리(정의된 시간 간격으로 실행되는 Update 함수)
    * Rigidbody를 이용한 처리 전반
    * 애니메이션 (회피 방법 있음)

    그래서 Update 함수내에서 position을 조작하는 것으로 이동하고 있는 경우, timeScale=0으로 해도 움직이는 것이 가능한 상태가 되어 버립니다.

    CubeMoveManager.cs
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CubeMoveManager : MonoBehaviour
    {
        public float speed;
        // Update is called once per frame
        void Update()
        {
            var pos = transform.position;
            if (Input.GetKey("right"))
            {
                pos = new Vector3(pos.x + speed,pos.y,pos.z);
            }
            if (Input.GetKey("left"))
            {
                pos = new Vector3(pos.x - speed,pos.y,pos.z);
            }
            transform.position = pos;
        }
    }
    
    

    동영상


    이 상태를 피하는 방법은 우선 두 가지를 든다.
    * FixedUpdate로 변경
    * 이동 속도에 deltaTime을 적용

    주의점



    timeScale의 설정은 씬을 로드해도 그대로의 상태가 되므로, 씬을 천이할 때에는 반드시 timeScale=1로 재설정하는 것.
  • 좋은 웹페이지 즐겨찾기