Unity 2D游戏相机控制(水平,竖直,角色居中三种模式)

做2D游戏的时候,无非有三种模式,一种是只有竖直向上,一种是只有水平方向,一种是有水平又有竖直方向,我最近做游戏多关卡模式,不同模式就有着不一样的相机控制,按照平时的写法,也许有很多人就一下子写了三个相机脚本,现在我用了一个枚举类型来控制三个不一样的相机,贴代码:
using UnityEngine;
using System.Collections;


public class CameraCtrl : MonoBehaviour {

	public enum CameraType
	{
		Vertical,
		Horizontal,
		Normal
	}

	public CameraType cameraType;
	public float dampTime = 1.5f;
	public Transform target;
	// 相机移动速度,初始速度清零
	private Vector3 velocity = Vector3.zero;

	// 相机单例
	private static CameraCtrl instance;
	public static CameraCtrl Instance {
		get {
			return instance;
		}
	}

	// 屏幕的默认宽高的1/100 (预编译)
#if UNITY_ANDROID
	private static float devHeight = 8.54f;
	private static float devWidth = 4.8f;
#elif UNITY_IPHONE
	private static float devHeight = 9.6f;
	private static float devWidth = 6.4f;
#else
	private static float devHeight = 19.20f;
	private static float devWidth = 10.80f;
#endif

	// Use this for initialization
	void Awake () {
		instance = this;
		// 屏幕适配
		float screenHeight = Screen.height;
		
		//Debug.Log ("screenHeight = " + screenHeight);
		
		//this.GetComponent<Camera>().orthographicSize = screenHeight / 200.0f;
		
		float orthographicSize = this.GetComponent<Camera>().orthographicSize;
		
		float aspectRatio = Screen.width * 1.0f / Screen.height;
		
		float cameraWidth = orthographicSize * 2 * aspectRatio;
		
		//Debug.Log ("cameraWidth = " + cameraWidth);
		
		if (cameraWidth < devWidth)
		{
			orthographicSize = devWidth / (2 * aspectRatio);
			Debug.Log ("new orthographicSize = " + orthographicSize);
			this.GetComponent<Camera>().orthographicSize = orthographicSize;
		}
		
	}

	// Update is called once per frame
	void LateUpdate () 
	{
		if (target) {
			SetCamera();
		} else {
			SetTarget();
		}
	}

	// 设置相机
	void SetCamera () {
		Vector3 point = GetComponent<Camera> ().WorldToViewportPoint (target.position);
		Vector3 delta = target.position - GetComponent<Camera> ().ViewportToWorldPoint (new Vector3 (0.5f, 0.5f, point.z)); 
		Vector3 destination = transform.position + delta;
		switch (cameraType) {
		case CameraType.Vertical:// 竖直相机
			transform.position = Vector3.SmoothDamp (transform.position, 
			                                         new Vector3 (transform.position.x, destination.y, destination.z), 
			                                         ref velocity, dampTime);
			break;
		case CameraType.Horizontal:// 水平相机
			transform.position = Vector3.SmoothDamp (transform.position, 
			                                         new Vector3 (destination.x, transform.position.y, destination.z), 
			                                         ref velocity, dampTime);
			break;
		case CameraType.Normal:// 无限制的相机
			transform.position = Vector3.SmoothDamp (transform.position, 
			                                         destination, 
			                                         ref velocity, dampTime);
			break;
		default:
			break;
		}
	}
	// 设置目标
	void SetTarget () {
		target = GameObject.FindGameObjectWithTag ("Player").transform;
	}
}

猜你喜欢

转载自blog.csdn.net/a3636987/article/details/45371725