[TIL] 33 파티클, 사운드 ⭐⭐

업데이트:

카테고리:

태그: , ,




유니티 숙련주차 4일차 + 개인과제

   [o] 알고리즘 문제 - 43
   [o] 강의 듣기 - 15강~
   [X] 다른반 발표 보기







1. raycast

  • Unity에서는 Physics.Raycast 또는 Physics2D.Raycast를 사용하여 Raycast를 수행할 수 있습니다. 이들 메서드는 시작점, 방향, 최대 거리, 그리고 선택적으로 레이어 마스크를 매개변수로 받습니다.
  • Raycast는 비주얼 디버깅을 위해 Debug.DrawRay와 함께 사용할 수 있습니다. 이를 통해 Scene 뷰에서 Raycast의 경로를 시각적으로 확인할 수 있습니다.

Debug.DrawRay
image

// TopDownRangeEnemyController.cs : TopDownEnemyController
int layerMaskTarget = Stats.CurrentStates.attackSO.target;
RaycastHit2D hit = Physics2D.Raycast(transform.position, direction, 11f, (1 << LayerMask.NameToLayer("Level")) | layerMaskTarget);
Debug.DrawRay(transform.position, direction, Color.green);

raycast1







2. 넉백구현

입력을 받지 않으면 knockbackDuration이 줄어들지 않는다.

// TopDownMovement
    private void Start()
    {
        _controller.OnMoveEvent += Move;
    }

    private void FixedUpdate()
    {
        ApplyMovement(_movementDirection);
    }
    private void Move(Vector2 direction)
    {
        _movementDirection = direction;
        if (knockbackDuration > 0.0f)
        {
            knockbackDuration -= Time.fixedDeltaTime;
        }
    }
    private void ApplyMovement(Vector2 direction)
    {
        direction = direction * _stats.CurrentStates.speed;

        if (knockbackDuration > 0.0f)
        {
            direction += _knockback;
        }
        _rigidbody.velocity = direction;
        knockbackDuration -= Time.fixedDeltaTime;
    }
    public void ApplyKnockback(Transform other, float power, float duration)
    {
        knockbackDuration = duration;
        _knockback = -(other.position - transform.position).normalized * power;
    }
}
  • 코드에서 OnMove (방향키 입력 받을 때) 만 knockbackDuration -= Time.fixedDeltaTime; 가 된다. 그러므로 넉백이 계속 발생하는 현상이 있다고 생각했다.
  • 코드를 ApplyMovement 부분에 넣었고 update가 되며 넉백시간이 적용되게 하였다.







3. 파티클 시스템

  • 파티클 시스템은 수 천개의 작은 2D 또는 3D 오브젝트들을 관리하고, 그들의 동작과 생애를 제어
  • 주요 컴포넌트는 ‘emitter’(발사체), ‘particles’(파티클), ‘animator’(애니메이터), ‘renderer’(렌더러) 등

파티클
image

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

public class DustParticleControl : MonoBehaviour
{
    [SerializeField] private bool createDustOnWalk = true;
    [SerializeField] private ParticleSystem dustParticleSystem;

    public void CreateDustParticles()
    {
        if (createDustOnWalk)
        {
            dustParticleSystem.Stop();
            dustParticleSystem.Play();
        }
    }
}

애니메이션 이벤트 추가
image
image

타격 시 파티클

ProjectileManager 수정
public void CreateImpactParticlesAtPostion(Vector3 position, RangedAttackData attackData)
{
    _impactParticleSystem.transform.position = position;
    ParticleSystem.EmissionModule em = _impactParticleSystem.emission;
    em.SetBurst(0, new ParticleSystem.Burst(0, Mathf.Ceil(attackData.size * 5)));
    ParticleSystem.MainModule mainModule = _impactParticleSystem.main;
    mainModule.startSpeedMultiplier = attackData.size * 10f;
    _impactParticleSystem.Play();
}

RangedAttackController 수정
private void DestroyProjectile(Vector3 position, bool createFx)
{
    if(createFx)
    {
        _projectileManager.CreateImpactParticlesAtPostion(position, _attackData);
    }
    gameObject.SetActive(false);
}

Particle System-Emission
image

SetBurst
image

new PaticleSystem.Burst
image







4. 사운드

Sound







5. collider 2D 2개

trigger충돌도 추가로 가능
image







6. setACtive, enabled

setACtive, enabled 차이





참고 : 유니티 TOP


📔

댓글남기기