2017-01-19 2 views
0

학교 프로젝트를 위해 3 인칭 게임을 만들었지 만 충돌과 관련하여 문제가 있습니다. 저는 구형 충돌기가있는 카메라를 가진 플레이어가 있습니다. 카메라가 집과 같은 모든 풍경 개체와 충돌하면 축소해야합니다. 충돌 상황을 벗어나면 이전 위치로 복귀해야합니다 (로컬 y는 4.5 여야합니다). 이제는 서있을 때 다음과 같은 문제가 발생합니다. 카메라가 끊임없이 물체의 충돌 자에 들어가서 들어가서 줌인 및 줌인을 계속합니다. 결과적으로 정말 이상하게 보이는 카메라 동작이 발생합니다. 이 문제를 해결할 방법이 있습니까? Unity : Camera Collider

나는 다음과 같은 코드를 사용 :

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



public class CamMovement : MonoBehaviour 
{ 
    public GameObject Parent; 

    //Checks if the camera collides with something 
    void OnTriggerStay(Collider other) 
    { 
     //When colliding, the camera moves up and back from the player object   
     transform.position += new Vector3(0, 0.2f, -0.2f);  
    } 


    void Update() 
    { 
     //makes sure the camera always looks at the player object 
     transform.LookAt(Parent.transform); 

     //Moves the camera back to the normal (local) position 
     if (transform.localPosition.y > 4.5f) 
     { 
      transform.position += new Vector3(0, Time.deltaTime * -4f, Time.deltaTime * 4f); 
     } 
    } 
} 

는 카메라가 뭔가에 충돌 할 때의 모습의 영상 : 나는 당신이 제대로 달성하고자하지만 난 것들 이해하면 http://imgur.com/a/7ot9R

+0

는, 그것은 카메라 입자 가속기의 취득 및 경우 (다른 ==의 playerCollider!)'할 문제가 해결되면 알려 주시면 적절한 답변으로 작성하겠습니다. –

+0

문제가 해결 되었다면 문제가 해결되었다고 생각하십시오. _ (답변을 수락하면 향후 방문자가이 페이지를 방문하는 데 도움이됩니다.) _ – Kardux

답변

1

어떤 충돌기가 카메라 충돌기와 충돌하는지 확인해야합니다. 당신의 OnColliderEnter(Collider other)이 같은이 구조를 사용하여 뭔가 :;`{zoomOut()} 당신은 플레이어 객체에 태그를 넣을 수

Collider playerCollider = GameObject.Fine("Player").GetComponent<Collider>(); 
if (!other == playerCollider) 
{ 
//Do your zooming out. 
} 
0

확실하지 않음 그것에게 총을 줘.

나는 당신이 방아쇠를 입력했을 때 멀리 이동하고 종료 할 때 돌아갈 카메라를 말할 수 있도록 OnTriggerEnterOnTriggerExit 이벤트를 조사해야한다고 생각한다.

public class CamMovement : MonoBehaviour 
{ 
    //using "parent" as variable name is not recommended since Transform class already contains a parent variable 
    [SerializeField] 
    private GameObject parentToLookAt; 
    [SerializeField] 
    private Vector3 localPositionOffset; 
    [Range(0.0f, 10.0f)] 
    [SerializeField] 
    private float transitionSpeed; 

    private Vector3 localPositionOnStart; 
    private bool applyOffset; 

    void Start() 
    { 
     localPositionOnStart = transform.localPosition; 
     applyOffset = false; 
    } 

    void Update() 
    { 
     //Makes sure the camera always looks at the player object 
     //You can also use: transform.LookAt(transform.parent); 
     transform.LookAt(parentToLookAt.transform); 

     //Moves the camera to the right local position (note that using Mathf.Lerp is not optimal performance-wise but if you want more info on this 
     //I recommend looking for further informations at https://chicounity3d.wordpress.com/2014/05/23/how-to-lerp-like-a-pro/) 
     if (applyOffset) 
     { 
      transform.localPosition = Mathf.Lerp(transform.localPosition, localPositionOnStart + localPositionOffset, transitionSpeed * Time.deltaTime); 
     } 
     else 
     { 
      transform.localPosition = Mathf.Lerp(transform.localPosition, localPositionOnStart, transitionSpeed * Time.deltaTime); 
     } 
    } 

    //Checks if the camera collides with something 
    void OnTriggerEnter(Collider other) 
    { 
     applyOffset = true; 
    } 

    //Checks if the camera stops colliding with something 
    void OnTriggerExit(Collider other) 
    { 
     applyOffset = false; 
    } 

    //You can also use this: 
    //void OnTriggerStay(Collider other) 
    //{ 
    // applyOffset = true; 
    //} 
    // and set applyOffset to false at the end of the Update() method (OnTrigger events are called before Update each frame) 
} 

두 가지 더 :

  • 는 (이이 클래스 이름으로 예약되어 있습니다) 변수 이름을 시작하는 대문자를 사용하지 않는 일반적인 규칙의 C#으로 프로그래밍 : 당신이 here를 확인하실 수 있습니다 전역 지침
  • [SerializeField] 속성을 사용하여 개인 변수를 직렬화 할 수 있습니다. (따라서 해당 변수가 관리자에 나타납니다.) 디자이너와 함께 작업 할 때 유용한 [Range()] 속성을 추가했습니다. (원시 번호가 마음에 들지 않습니다.)
+0

내가 틀릴 수도 있지만 질문에 대해 오해 한 것 같습니다. –

+0

@JamesHughes 예. 확실하지 않았습니다. 문제가 Collider가 무엇인가 충돌하고 있는지에 대해 알지 못합니다. (답변을 할 때 빠른 테스트가 필요합니다. (내 상태에서도 유효합니다. 원하지 않는 충돌을 피하기 위해 항상 테스트를 수행해야합니다. 아니면 카메라가 플레이어에서 멀어 질 때 카메라 콜리더가 더 이상 충돌하지 않아서 뒤로 움직이기 시작한 다음 앞뒤로 움직이는 것을 멈추지 않을 수도 있습니다 (실제로 계층 구조가 어떻게 구성되어 있는지 알 수 없습니다). 질문에서 ...). – Kardux