Table of Contents
요런기능을 말함
필요한 변수와 함수
public float cameraSphereRadius = 0.2f;
public float cameraCollisionOffset = 0.2f;
public float maximunCollisionOffest = 2.2f;
private void HandleCameraCollision(float maxDistance, Vector3 startPos)
{
targetPos = 0f;
RaycastHit hit;
Vector3 dir = (transform.position - startPos).normalized;
Debug.DrawLine(startPos, startPos + dir * maxDistance, Color.red, 0.5f);
if(Physics.SphereCast(startPos, cameraSphereRadius, dir, out hit, maxDistance, obstacleCheckLayermask))
{
float dis = Vector3.Distance(transform.position, hit.point);
targetPos = (dis - cameraCollisionOffset);
}
if (Mathf.Abs(targetPos) > maximunCollisionOffest)
{
targetPos = maximunCollisionOffest;
}
cam.transform.localPosition = Mathf.Lerp(cam.transform.localPosition.z, targetPos, Time.fixedDeltaTime / 0.2f) * Vector3.forward;
}
진행중인 프로젝트에서 호출하는 방식
Vector3.up * 1.5f를 한 이유는 로봇모델의 피봇이 센터가아니라 발바닥에있어서임
private void FixedUpdate()
{
Vector3 dir = (agentCameraPt.myAgent.transform.position + Vector3.up * 1.5f) - transform.position;
HandleCameraCollision(dir.magnitude, (agentCameraPt.myAgent.transform.position + Vector3.up * 1.5f));
}
카메라 계층구조
자식오브젝트인 Light는 빛이 필요해서 넣은거고 해당기능과는 상관없음
카메라의 EmptyObject로 부모객체가 하나 있어야함
참고한 영상
이 영상에 코드에서 내가 수정한점은
1. 스피어 캐스트를 카메라에서 쏘는게아닌 플레이어에서 카메라 방향으로 쏘게했다.
2. 원본은 카메라의 포지션 영점을 플레이어 뒤로두고 장애물을 감지하면 +로 다가가게 돼있는데, 나는 포지션 영점을 가까이두고 장애물이 없으면 -로 멀어지게 했다.
'Unity > C#' 카테고리의 다른 글
[Unity, C#] Vector3 회전 (0) | 2022.01.28 |
---|---|
[C#]선택적 매개변수로 Color사용 / ?? 및 ??=, ?. 연산자 (0) | 2022.01.28 |
Unity ParticleSystem Trigger모듈 (0) | 2022.01.21 |
[C#] params 가변인자 매개변수 (0) | 2022.01.17 |
Unity 3D 모바일 터치이펙트 만들기 (0) | 2021.12.08 |