public void MouseTraceVignette(Vector3 pos)
{
Vector2 screenPos = Camera.main.WorldToScreenPoint(pos);
Vector2 mousePos = Input.mousePosition;
curr = 1f-Vector2.Distance(screenPos, mousePos)/(res);
vignette.intensity.value = curr;
}
이전 코드
단일 객체에서 vignette 범위를 호출하는 함수로 달일객체이기에 거리비교가 필요 없엇다.
변경된 기획 내용 : 라운드당 개체 수 증가
public void MouseTraceVignette()
{
Vector2 pos = Vector2.one;
float cDist = float.MaxValue;
for (int i = 0; i < tracers.Count; i++)
{
if (tracers[i].IsDestroyed()) return;
float curr = Vector2.Distance(Input.mousePosition, tracers[i].position);
if (cDist > curr))
{
cDist = curr;
pos = tracers[i].transform.position;
}
}
Vector2 screenPos = Camera.main.WorldToScreenPoint(pos);
Vector2 mousePos = Input.mousePosition;
curr = 1f-Vector2.Distance(screenPos, mousePos)/(res);
vignette.intensity.value = curr;
}
대응 코드
여러 객체에서 해당 함수를 호출해야 하기에 전역번수로 Transform 리스트를 선언하여
거리를 비교해 해결했다.
다만 아쉬운 점은 dist는 두 점 사이의 거리를 재는 함수인데 식은 다음과 같다
루트 계산 이전에 판별 할 수 있기에 불필요한 연산이 들어갔다.
그래서 다음과 같이 개선하였다.
public void MouseTraceVignette()
{
Vector2 pos = Vector2.one;
float cDist = float.MaxValue;
for (int i = 0; i < tracers.Count; i++)
{
if (tracers[i].IsDestroyed()) return;
Vector2 tempScreenPos = Camera.main.WorldToScreenPoint(tracers[i].position);
float x = tempScreenPos.x - Input.mousePosition.x;
float y = tempScreenPos.y - Input.mousePosition.y;
float tempdist = (x * x) + (y * y);
if (cDist > tempdist)
{
cDist = tempdist;
pos = tracers[i].transform.position;
}
}
curr = 1f-(Mathf.Sqrt(cDist) / res);
vignette.intensity.value = curr;
}
최종 수정 코드
루트를 최종 연산에 사용하도록 개선하였다.
- 오늘 학습 키워드
- 기획 변경 대응
- 오늘 학습 한 내용을 나만의 언어로 정리하기
- 꺼진불도 다시보자.
- 학습하며 겪었던 문제점 & 에러
- 문제&에러에 대한 정의
- 불필요한 루트연산
- 내가 한 시도와 해결 방법
- 루트 이전에 제곱값에서 해결 할 수 있기에 연산을 최소화 하였다.
- 이 문제&에러를 다시 만나게 되었다면?
- 순수 거리비교 단계에선 루트 이전의 값을 비교할 것 같다.
- 내일 학습 할 것은 무엇인지
- 내일은 드디어 발표다. 다른팀이 힘쓴부분을 찾고 내가 할 수 있는 부분을 찾아보고 신기한 부분들을 연구 해볼 것 같다.