Game Dev Study Log

by ricale

취미로 하는 게임 개발 공부

강의 52강 수강

강의 수강: Unity Turn-Based Strategy Game: Intermediate C# Coding

52. Shooting Bullet Visual (20:51)

Effect - Trail 객체를 생성해서 총 쏜 효과를 만든다.

  • Trail Renderer
    • Width: 0.05
    • Time: 0.1
    • Min Vertex Distance: 0.01
    • autodestruct: enable
    • Material: Material 객체를 아래 속성으로 새로 만든다.
      • Surface Input
      • Base Map: 적당한 색 (강의에서는 노란색)
      • Emission: enable
        • Emission Map: 적당한 색 (강의에서는 빨간색)

만든 Trail 객체를 Prefab 으로 만든다.

Unit Prefab 내부의 총 객체 안에 ShootPoint 객체를 만들어서 총구에 위치시킨다.

이벤트 리스너에서 원하는 데이터 형식 받기

public event EventHandler<OnShootEventArgs> OnShoot;

public class OnShootEventArgs : EventArgs
{
    public Unit targetUnit;
    public Unit shootingUnit;
}

private void Shoot()
{
    OnShoot?.Invoke(this, new OnShootEventArgs {
        targetUnit = targetUnit,
        shootingUnit = unit,
    });
    targetUnit.Damage();
}

ShootAction 에서 총을 쏘면 이벤트를 듣고 있던 UnitAnimator 에서 총알 발사 애니메이션 실행.

  • 위에서 만든 Trail Prefab (BulletProjectile) 으로 객체를 생성해서 움직인다.
private void ShootAction_OnShoot(object sender, ShootAction.OnShootEventArgs e)
{
    animator.SetTrigger("Shoot");

    Transform bulletProjectileTransform =
        Instantiate(bulletProjectilePrefab, shootPointTransform.position, Quaternion.identity);

    BulletProjectile bulletProjectile = bulletProjectileTransform.GetComponent<BulletProjectile>();

    Vector3 targetUnitShootAtPosition = e.targetUnit.GetWorldPosition();
    targetUnitShootAtPosition.y = shootPointTransform.position.y;
    bulletProjectile.Setup(targetUnitShootAtPosition);
}

public class BulletProjectile : MonoBehaviour
{
    private void Update()
    {
        Vector3 moveDir = (targetPosition - transform.position).normalized;

        float deistanceBeforeMoving = Vector3.Distance(transform.position, targetPosition);
        float moveSpeed = 200f;
        transform.position += moveSpeed * Time.deltaTime * moveDir;

        float distanceAfterMoving = Vector3.Distance(transform.position, targetPosition);

        if(deistanceBeforeMoving < distanceAfterMoving)
        {
            trailRenderer.transform.parent = null;
            Destroy(gameObject);
        }
    }
}

총 쏜 이펙트가 좀 더 자연스럽게 사라지게 하기 위해 BulletProjectile 객체를 없애기 전에 trailRenderer 의 부모를 null 로 하고, autodestruct 옵션을 켜면 trail 애니메이션이 끝날 때 자연스럽게 사라진다.

총 맞은 이펙트를 만들기 위해 Effect - Particle 객체를 만드는 데 옵션을 꽤 많이 설정한다. 일일이 기록하진 않겠다. 그냥 기억 안나면 강의를 다시 보자.

Trail, Particle 과 Material 을 직접 만들어서 적용했는데 퀄리티가 괜찮다. 다음 강의가 Health System 이니 점점 게임 같아지는 것 같아서 재밌다.