본문 바로가기
Unity 3D/Unity3D

[Unity 3D] FixedUpdate (유도탄 만들기)

by dbxxrud 2019. 5. 13.

 

 

FixedUpdate - FixedUpdate도 Update와 마찬가지로 프레임마다 보통 여러 번 불리게 된다. 하지만 각각의 호출은 고정된 시간 간격을 기반으로 규칙적으로 표준화되어 일어난다. 가장 흔히 사용하는 경우는 유니티의 물리 기능을 사용할 때다. 시간에 따라 Rigidbody 컴포넌트의 속도나 속성을 업데이트하는 경우 Update보다 FixedUpdate가 더 적합하다.

 

 

 

Update는 안 되는 것일까? 

 

Update는 프레임 속도에 영향을 받기 때문에 불규칙하게 호출되어서 물리 검사가 제대로 되지 않을 수 가있으며, 또한 과도한 Update 호출을 막기 위하여 FixedUpdate를 사용하는 것이다.

 

 

 

Time.deltaTime과 같이 계산해야 할까?

 

FixedUpdate의 움직임을 적용하여 계산할 때 Time.deltaTime 만큼 값을 곱하여 계산해줄 필요가 없다. FixedUpdate는 프레임의 속도와 관계없이(비종속적)  Fixed Timestep에 호출이 되기 때문이다.

 

 

 

 

시간 관리자(Time Manager)

 

Time Manager(메뉴: Edit > Project Settings > Time)를 사용하여 게임 내에서 타이밍을 제어하는 여러 프로퍼티를 설정할 수 있다.

 

 

 

 

예제

 

아래 예제는 Fixed Update를 이용한 유도탄(?) 예제이다. 캐릭터가 원거리형 몬스터의 일정 범위 안에 진입하면 공격을 시작하고 오브젝트 풀링으로 미리 생성한 Fireball 이 Active되면 캐릭터를 추적하는 것을 연출하였다. 

(절대 피할수 없기 때문에 미리 대미지를 입게 한 것임)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ball : MonoBehaviour
{
    /* 파이어볼 프리팹이 가지고 있는 스크립트 입니다. */
 
    public Transform playerTr; 
    public Rigidbody ballrigid; 
    public float turn;
    public float ballVelocity;
 
    public void FixedUpdate() // 유도탄
    {
        ballrigid.velocity = transform.forward * ballVelocity;
        var ballTargetRotation = Quaternion.LookRotation(playerTr.position + new Vector3(0,0.8f) - transform.position);
        ballrigid.MoveRotation(Quaternion.RotateTowards(transform.rotation, ballTargetRotation, turn));
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter