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

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

/// <summary>
///CameraCtrl
///Created by Wang YuTing
/// </summary>

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) {
			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;
			if (cameraType == CameraType.Vertical) {  	// 竖直相机
				transform.position = Vector3.SmoothDamp (transform.position,
				                                        new Vector3 (transform.position.x, destination.y, destination.z),
				                                        ref velocity, dampTime);
			} else if (cameraType == CameraType.Horizontal) {	// 水平相机
				transform.position = Vector3.SmoothDamp (transform.position,
				                                         new Vector3 (destination.x, transform.position.y, destination.z),
				                                         ref velocity, dampTime);
			} else if (cameraType == CameraType.Normal){	// 无限制的相机
				transform.position = Vector3.SmoothDamp (transform.position,
				                                         destination,
				                                         ref velocity, dampTime);
			}
		} else {
			SetTarget();
		}
	}

	void SetTarget () {
		target = GameObject.FindGameObjectWithTag ("Player").transform;
	}
}

时间: 2024-12-11 12:04:50

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

Unity之2D游戏界面相机控制

之前写的关于2D游戏界面相机的水平.竖直.以人为中心三种模式的相机控制,我写着写着,总感觉相机适配有点繁琐,而且适配得不怎么好,多平台的时候因为资源有限我也不知道有没有完全适配,今天给大家分享一下我今天写的一个2D游戏场景相机适配,感觉挺好的,有需要的可以用着试试看,接下来我贴上代码: using UnityEngine; using System.Collections; public class CameraControl_2D : MonoBehaviour { // 默认屏幕大小 flo

Unity 2D游戏开发教程之精灵的死亡和重生

Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于是我们发现游戏里的精灵,即使是跳入“万丈深渊”,也依然存活,显然这种游戏逻辑无法让人接受.因此,本节就来说明为精灵添加死亡和重生这两种状态的方法,并使用脚本实现这两种状态的逻辑.具体的实现步骤如下: (1)在Hierarchy视图里,新建一个Empty对象,并命名为Death Trigger,设置其

Unity 2D游戏开发教程之游戏中精灵的跳跃状态

Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却无法从低的地面移动到高的地面,因为当前的游戏精灵只能左右移动,即left和right.为了解决这个问题,本节就来为精灵添加跳跃状态.   图2-14  精灵从一个地面移动到另一个地面 (1)如果要为精灵添加跳跃状态,即jump,就不得不再引入其它状态: q   landing:用于表示精灵接触到地面

Unity 2D游戏开发教程之使用脚本实现游戏逻辑

Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态.但是这其中还有一些问题.例如,我们无法使用键盘控制精灵当前要进入的动画状态,而且精灵也只是在原地播放动画而已.但我们希望精灵在进入到PlayerWalkingAnimation状态时,位置应该发生改变. 要解决这些问题,就需要编写脚本.也就是说,要使用脚本来实现动画的播放控制,以及其它一些游戏的逻辑

Unity 2D游戏开发教程之摄像头追踪功能

Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以及游戏逻辑的想象空间.看来有必要让精灵拥有更多的状态,而这就是本章要讲解的主要内容. 摄像头追踪功能 游戏里的精灵可以在游戏场景中任意移动,这没什么问题,可是这就导致了一个问题,就是精灵可能移动到我们的视野之外,或者说游戏视图之外.为了解决这个问题,很多游戏都采用了"摄像头追踪"的方法,使

Flex实现水平竖直居中布局

传统的布局使用的是“盒模型”加上display.position和float属性,但是对于一些特殊的布局实现例如居中却是比较麻烦,所以,为了解决一些复杂的布局问题,一种更为灵活的布局方式出现了,那就是Flex布局. Flex 即为Flexible Box,指的是“弹性布局”,它可以为盒模型提供更加灵活的布局方式,例如,用flex可以优雅地实现水平竖直居中的布局. 例如下面这个例子,我们想做的是让child元素在parent里面水平竖直居中: <!DOCTYPE html> <html l

?Unity 2D游戏开发教程之2D游戏的运行效果

Unity 2D游戏开发教程之2D游戏的运行效果 2D游戏的运行效果 本章前前后后使用了很多节的篇幅,到底实现了怎样的一个游戏运行效果呢?或者说,游戏中的精灵会不会如我们所想的那样运行呢?关于这些疑问,会在本节集中揭晓. (1)单击Unity上方,工具栏里的播放按钮,开始运行当前的游戏,默认精灵当前进入的是Idle动画状态,如图1-34所示. 图1-34  Idle状态 (2)当读者按下键盘上的左.右方向键,或者A.D键的时候,精灵会进入Walking动画状态,并且会向左或者向右移动,如图1-3

Unity 2D游戏开发教程之为游戏场景添加多个地面

Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面.具体的操作方法是: (1)在Project视图里,新建一个文件夹,命名为Prefabs.然后将Hierarchy视图里的Platform对象,拖动到Prefabs文件夹中,如此一来就可以生成一个同名的预置资源,如图2-11所示. 图2-11  通过拖动对象到Project视图的方式,新建预置资源 (

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的.实际上,Unity在2013年发布4.3版本的时候,就开始提供对制作2D游戏的支持了.例如,提供了一些专用于开发2D游戏的Unity工具.现在Unity已经发布了版本4.5,对2D游戏的支持更是完善了不少.为了说明Unity对2D游戏所提供的支持,本章会使用这些在Unity中原生的工具,开发一个简单的2D游戏.本文选自<Unity