본문 바로가기
Engine/UNITY

Unity Script 기초 공부 - 카메라 제어하기(확대, 축소, 오브젝트 회전, 모바일터치)

by tartist 2015. 12. 18.

스크립트 공부중..

회사에서 캐릭터 선택창에서 사용될 카메라 회전 구조를 정리하면서 짠 초기 코드지만, 나름 유니티 스크립트 개념을 깨워준 코딩임..ㅋㅋ

 

using UnityEngine;
using System.Collections;

public class FollowCam : MonoBehaviour
{
 
 public Transform target;     //추적할 타겟 게임 오브젝트의 Transform 변수
 public float dist = 10.0f;     // 카메라와의 일정 거리
 public float height = 5.0f;     // 카메라의 높이 설정
 public float dampRotate = 5.0f;     // 부드러운 회전을 위한 변수
 public float TurnSpeed;
 public float camPos;

 Vector3 V3;
 
 private Transform tr;
 // Use this for initialization
 void Start ()
 {
  //카메라 자신의 transform 컴포넌트를 tr에 할당
  tr = GetComponent<Transform> (); 
  TurnSpeed = 2f;
  camPos = 2f;
 }

 void Update()
 {
  Vector3 PositionInfo = tr.position - target.position;     // 주인공과 카메라 사이의 백터정보
  PositionInfo = Vector3.Normalize (PositionInfo);     // 화면 확대가 너무 급격히 일어나지 않도록 정규화~

  target.transform.Rotate (0, Input.GetAxis ("Horizontal")* TurnSpeed, 0);      //마우스 입력이 감지되면 오브젝트 회전
  transform.RotateAround (target.position, Vector3.right, Input.GetAxis ("Mouse Y")* TurnSpeed);     //마우스 Y(Pitch) 움직임 인지하여 화면 회전
  tr.position = tr.position - (PositionInfo * Input.GetAxis ("Mouse ScrollWheel")* TurnSpeed);     // 마우스 휠로 화면확대 축고
 }
}

 

마우스 회전시 카메라 좌우 회전~

오브젝트에 왼쪽마우스를 찍고 돌리면 회전~

훨로 카메라 확대 축고~ 

 

 

아래는 똑같은 형식의 모바일 터치 구현 스크립트

using UnityEngine;
using System.Collections;

public class TouchCameraControl : MonoBehaviour
{
 public Transform charTarget;
 private Camera cameratarget;
 private Vector2 PrevPoint;

 public float moveSensitivityX = 1.0f;
 public float moveSensitivityY = 1.0f;
 public bool updateZoomSensitivity = true;
 public float orthoZoomSpeed = 0.05f;
 public float minZoom = 1.0f;
 public float maxZoom = 20.0f;
 public float perspectiveZoomSpeed = .5f;
 private Transform tr;

 void Start ()
 {
  //카메라 자신의 transform 컴포넌트를 tr에 할당
  tr = GetComponent<Transform> ();
  cameratarget = Camera.main; 
 }

 void Update()
 {
  Vector3 PositionInfo = tr.position - charTarget.position;
  PositionInfo = Vector3.Normalize (PositionInfo);

  if (updateZoomSensitivity)
  {
   moveSensitivityX = cameratarget.orthographicSize / 5.0f;
   moveSensitivityY = cameratarget.orthographicSize / 5.0f;
  }

  Touch[] touches = Input.touches;

  if (cameratarget)
  {
   if (Input.touchCount == 1) {
    if (Input.GetTouch (0).phase == TouchPhase.Moved) {
     PrevPoint = Input.GetTouch (0).position - Input.GetTouch (0).deltaPosition;

     charTarget.transform.Rotate (0, -(Input.GetTouch (0).position.x - PrevPoint.x), 0);
     cameratarget.transform.RotateAround (charTarget.position, Vector3.right, -(Input.GetTouch (0).position.y - PrevPoint.y)*0.5f);

     PrevPoint = Input.GetTouch (0).position;
    }
   }
  }
  if (cameratarget) {
   if (Input.touchCount == 2)
   {
    Touch touchZero = Input.GetTouch(0);
    Touch touchOne = Input.GetTouch(1);

    Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
    Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;

    float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
    float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;

    float deltaMagnitudediff = prevTouchDeltaMag - touchDeltaMag;

    tr.position = tr.position - -(PositionInfo * deltaMagnitudediff * orthoZoomSpeed);
   }
  }
 }
}