게임 개발 공부 기록
61일차 - Abyss_Slayer 최종 팀 프로젝트 11 (TrailRenderer 잔상 문제 해결)
00lwt
2025. 4. 18. 21:32
이틀을 고민하던 투사체가 처음 생성되고 풀에 반환되기 전까지 TrailRenderer의 잔상이 생기는 현상을 드디어 해결했다.
▶▷ TrailRenderer 잔상 문제 해결
변경 전
// ...
void Awake()
{
trailRenderer.enabled = false;
}
private void Update()
{
if(fired)
{
Move();
Rotate();
UpdateTrailPosition();
}
}
// ...
/// <summary>
/// 법사 유도탄 스킬 초기화
/// </summary>
/// <param name="damage">데미지</param>
/// <param name="position">생성위치</param>
/// <param name="rotation">생성 시 회전값</param>
/// <param name="target">따라갈 목표</param>
/// <param name="speed">투사체 속도(비례하여 유동적으로 변화)</param>
/// <param name="homingPower">투사체 유도력(비례하여 유동적으로 변경)</param>
/// <param name="homingTime">투사체 유도시간</param>
/// <param name="homingCurve">투사체 유도곡선</param>
public void Init(float damage, Vector3 position, Quaternion rotation, Transform target, float speed, float homingPower, float homingTime, AnimationCurve homingCurve)
{
transform.position = position;
transform.rotation = rotation;
this.damage = damage;
this.target = target;
inputSpeed = speed;
this.homingPower = homingPower;
if(homingCurve != null)
this.homingCurve = homingCurve;
this.homingTime = homingTime;
trailRenderer.Clear();
trailRenderer.enabled = true;
fired = true;
fireTime = Time.time;
}
//정해진 속도에 따라, 자신(투사체)의 right(+x)방향으로 고정적으로 진행
void Move()
{
speed = inputSpeed * speedCurve.Evaluate((Time.time - fireTime)/homingTime); //animationCurve와 시간 에따라 속도 유동적으로 변경
transform.Translate(Vector3.right * 10 * speed * Time.deltaTime);
}
// ...
예상했던대로 초기화 시점에 의한 문제였다. 기존에는 Init에서 trailRenderer를 Clear()한 다음 true로 활성화 해주고 Awake에서 false를 해주면 일단은 trailRenderer를 비활성화 되지 않을까 생각했다.
그러나 예상과 다르게 비활성화 되긴 하지만 투사체가 날아갈 때도 여전히 비활성화 상태였다.
Start로 바꿔도 보고 OnEnable로 바꿔보기도 하고 Update문에도 넣어봤는데 문제는 여전했다.
변경 후
private void Update()
{
if(fired)
{
Move();
Rotate();
UpdateTrailPosition();
}
}
// ...
public void Init(float damage, Vector3 position, Quaternion rotation, Transform target, float speed, float homingPower, float homingTime, AnimationCurve homingCurve)
{
transform.position = position; // 투사체 위치
transform.rotation = rotation; // 투사체 회전
this.damage = damage; // 데미지
this.target = target; // 타겟
inputSpeed = speed; // 입력 속도
this.homingPower = homingPower; // 유도력
if(homingCurve != null) this.homingCurve = homingCurve; // 유도 곡선
this.homingTime = homingTime; // 유도 시간
trailRenderer.Clear();
trailRenderer.enabled = false; // 궤적 비활성화
fired = true; // 발사 여부
fireTime = Time.time; // 발사 시간
}
// 속도에 따라 투사체의 right(+x)방향으로 고정적으로 진행
void Move()
{
trailRenderer.enabled = true;
speed = inputSpeed * speedCurve.Evaluate((Time.time - fireTime)/homingTime); // animationCurve와 시간 에따라 속도 유동적으로 변경
transform.Translate(Vector3.right * 10 * speed * Time.deltaTime);
}
답은 Init에 있었다. Init에서 무조건 true로 초기화 해야 한다는 생각 때문에 한참을 고민했는데 그러지 않고 false로 초기화 한 다음
Move()에서 true로 설정해서 투사체가 움직이기 시작하면 활성화되도록 하고 Update에서 호출하니 해결되었다.
추가로 보스가 맞지 않은 투사체가 주변을 빙글빙글 도는 현상이 있었는데 이 문제는 homingCurve를 후반으로 갈 수록 value를 높게 설정하여 거의 무조건 보스에 충돌하도록 설정하였다.