Unity 내일배움캠프 TIL 0918(1) | Physics.Raycast | 넉백 구현 | 파티클 시스템 | 애니메이션 이벤트

cheeseonrose·2023년 9월 18일
0

Unity 내일배움캠프

목록 보기
37/89
post-thumbnail

두둥 Unity 게임 개발 숙련 발제날
또 한 번 새로운 팀을 만났다 !

평소에 약간 눈여겨 보고 있었던 분과 팀이 되었다 하핫
이 분이 팀장인 팀에서 일해보고 싶다! 했었는데 드림스컴트루 해버림
얏호♪~ ᕕ( ᐛ )ᕗ
팀장 너무 많이 하셔서 그만하고 싶다고 하셨지만...팀장 해주시길 바랐어요.....이런 팀원이라 죄송합니다....히죽..

팀 노션 작성하고 강의 듣기 지옥 시작

13강 적 구현

FindGameObjectWithTag

  • Hierarchy 상에 있는 모든 오브젝트를 검사하여 지정된 태그와 일치하는 첫 번째 활성 GameObject를 반환
  • CPU를 많이 사용하는 연산이므로 Update 같은 곳에서 쓰면 성능 저하
    -> Awake나 Start 같은 초기화 메서드에서 한 번만 쓰는 것을 권장
  • 오브젝트가 많은 큰 씬에서는 Layer나 다른 메서드를 사용하는 것이 더 좋을 수 있음

Physics.Raycast / Physics2D.Raycast

  • Raycasting : 일련의 콜라이더와 교차하는지를 감지하는 데 사용되는 기술
    • 레이저 포인터, 총알 발사 효과, 플레이어 시야 계산 등
  • 시작점, 방향, 최대 거리, 레이어 마스크(선택)를 매개변수로 받음
  • hit 정보를 반환 -> 충돌한 객체, 충돌 지점, 충돌 지점의 정규화된 벡터가 포함됨
  • 충돌 검사에 비해 계산 비용이 많이 듦
    -> 가능한 경우 레이어 마스크를 사용하여 검사 범위를 제한하는 것이 성능에 좋음
  • Debug.DrawRay와 함께 사용 가능 (비주얼 디버깅)
if (distance <= shootRange)
{
	// 나와 Player 사이 막혀있는 지형이 있는지 확인
    int layerMaskTarget = Stats.CurrentStats.attackSO.target;
    RaycastHit2D hit = Physics2D.Raycast(transform.position, direction, 11f, (1 << LayerMask.NameToLayer("Level")) | layerMaskTarget);
    
    if (hit.collider != null && layerMaskTarget == (layerMaskTarget | (1 << hit.collider.gameObject.layer)))
    {
    	CallLookEvent(direction);
        CallMoveEvent(Vector2.zero);    // 이동 X
        IsAttacking = true;
    }
}

14강 넉백 구현

fixedDeltaTime

  • FixedUpdate 안에서는 deltaTime이 아닌 fixedDeltaTime으로 계산해야 함

코드

  • 방향 * 힘만큼 넉백 효과
private Vector2 _knockback = Vector2.zero;
private float knockbackDuration = 0.0f;

private void FixedUpdate()
{
	ApplyMovement(_movementDirection);
    if (knockbackDuration > 0.0f)
    {
    	knockbackDuration -= Time.fixedDeltaTime;
    }
}

public void ApplyKnockback(Transform other, float power, float duration)
{
	knockbackDuration = duration;
    _knockback = -(other.position - transform.position).normalized * power;
}



15강 데미지 피격 구현

무적 상태

  • 데미지를 입었을 때 0.5초 동안 무적 상태
private void Update()
{
	if (_timeSinceLastChange < healthChangeDelay)   // 마지막 공격을 당했을 때 _timeSinceLastChange를 0으로 설정
    {
    	_timeSinceLastChange += Time.deltaTime;
        if (_timeSinceLastChange >= healthChangeDelay)
        {
        	OnInvincibilityEnd?.Invoke();   // 0.5초가 지나면 무적 해제
        }
    }
}

체력 변화

  • 체력 변화가 양수이면 OnHeal, 음수이면 OnDamage
public bool ChangeHealth(float change)
{
	if (change == 0 || _timeSinceLastChange < healthChangeDelay)    // 아직 데미지를 받고 있는 중이면 넘어감
    {
    	return false;
    }
    
    _timeSinceLastChange = 0f;
    CurrentHealth += change;
    CurrentHealth = CurrentHealth > MaxHealth ? MaxHealth : CurrentHealth;
    CurrentHealth = CurrentHealth < 0 ? 0 : CurrentHealth;
    
    if (change > 0)
    {
    	OnHeal?.Invoke();
    } else
    {
    	OnDamage?.Invoke();
    }
    
    if (CurrentHealth <= 0f)
    {
    	CallDeath();
    }
    
    return true;
}

캐릭터 사망

  • DisappearOnDeath
    • 캐릭터가 죽으면 움직임을 멈추고 색상 투명도를 0.3으로 설정
    • 모든 컴포넌트는 Behaviour를 상속받게 되므로, Behaviour 형으로 순회하여 enabled를 false로 변경
    • 2초 뒤 오브젝트 파괴
void OnDeath()
{
	_rigidbody.velocity = Vector3.zero;
    
    foreach (SpriteRenderer renderer in transform.GetComponentsInChildren<SpriteRenderer>())
    {
    	Color color = renderer.color;
        color.a = 0.3f;
        renderer.color = color;
    }
    
    // 모든 컴포넌트는 Behaviour를 상속받게 됨
    foreach (Behaviour component in transform.GetComponentsInChildren<Behaviour>())
    {
    	component.enabled = false;
    }
    
    Destroy(gameObject, 2f);
}



16강 파티클 생성

파티클 시스템 (Particle System)

  • 수 천개의 작은 2D 또는 3D 오브젝트들을 관리하고, 동작과 생애를 제어
  • 주요 컴포넌트
    • emitter : 발사체
    • particles : 파티클
    • animator : 애니메이터
    • renderer : 렌더러
  • 시간에 따른 파티클의 행동을 시뮬레이션하며, 각 파티클에 대해 위치, 속도, 수명, 색상, 크기 등의 정보를 저장
  • 성능 최적화를 위한 기능 제공
    • 최대 파티클 수 제한
    • 파티클 적용 범위 제한
  • 파티클 시스템 속성

애니메이션 이벤트 (Animation Event)

  • 애니메이션이 진행되는 동안 코드를 실행시킬 수 있음
  • Unity 편집기를 통해 애니메이션 타임라인에 이벤트를 추가 -> 해당 이벤트가 호출할 함수 지정
  • 특정 프레임에서만 실행되며, 애니메이션 상태가 변경될 때에도 자동으로 실행되지 않음
  • 애니메이션 이벤트를 통해 호출되는 함수는 일반적으로 공용 함수(public function)이어야 하며, 매개변수가 없거나 최대 1개 가질 수 있음



나머지는 다음 TIL로~ヾ(°∇°*)

0개의 댓글