Unity实现游戏中摄像机视角控制

using UnityEngine;
using System.Collections;

public class NewCamera : MonoBehaviour {

	public GameObject cameraFather;
	public Transform target;
	public float rotatespeed;
	public float scalespeed;
	public float min;
	public float max;
	public Transform obj;
	public float cameraSpeed;

	private bool isLock =false;
	private Vector3 fCurrentRotation;
	private float currentSacale;
	private Vector3 currentRotation;
	private Vector3 lastMousePosition;
	// Use this for initialization
	void Start () {
		fCurrentRotation = cameraFather.transform.eulerAngles;
		currentRotation = transform.eulerAngles;
		lastMousePosition = Input.mousePosition;
	}

	// Update is called once per frame
	void Update() {
		if (obj != null && Input.GetKeyDown (KeyCode.Space) && isLock == false) {
			isLock = true;
		} else if (Input.GetKeyDown (KeyCode.Space)) {
			isLock = false;
		}
		if (isLock) {
			cameraFather.transform.position = obj.position;
		} else if(!Input.GetMouseButton(0)){
			if (Input.mousePosition.x <= Screen.width && Input.mousePosition.x >= Screen.width - 60) {
				cameraFather.transform.Translate (new Vector3(1,0,0)*cameraSpeed*Time .deltaTime);
			}else if(Input.mousePosition.x >= 0 && Input.mousePosition.x <= 60){
				cameraFather.transform.Translate (new Vector3(1,0,0)*-cameraSpeed*Time .deltaTime);
			}
			if(Input.mousePosition.y >= 0 && Input.mousePosition.y <= 60){
				cameraFather.transform.Translate (new Vector3(0,0,1)*-cameraSpeed*Time .deltaTime);
			}else if(Input.mousePosition.y >= Screen.height-60 && Input.mousePosition.y <= Screen.height){
				cameraFather.transform.Translate (new Vector3(0,0,1)*cameraSpeed*Time .deltaTime);
			}
		}

		currentSacale = 0;
		//transform.LookAt (camerachild.position);
		Vector3 mouseDelta = Input.mousePosition - lastMousePosition;
		lastMousePosition = Input.mousePosition;
		if (Input.GetMouseButton(0)) {
			fCurrentRotation.y += mouseDelta.x * rotatespeed * Time.deltaTime;
			currentRotation.x += mouseDelta.y * rotatespeed * Time.deltaTime;
			currentRotation.y += mouseDelta.x * rotatespeed * Time.deltaTime;
		}
		currentSacale = Input.mouseScrollDelta.y * scalespeed * Time.deltaTime;
		if(currentSacale != 0)
			currentSacale = Mathf.Clamp(currentSacale,min,max);
		Debug.Log (currentSacale);
		transform.position = target.position;
		cameraFather.transform.eulerAngles = fCurrentRotation;
		transform.eulerAngles = currentRotation;
		transform.Translate (new Vector3(0,0,currentSacale));
	}
}

 

1.创建一个空物体,将它(GameObject)拉到摄像机要观察的对象文件夹里面,对象就是类似英雄联盟的英雄。
2.将Transform栏的Position清0;
3.再将空物体拉出来放到与摄像机文件夹下,将Transform栏的Rotation清0;
4.将空物体拉出来到摄像机文件夹同层,将空物体Transform栏的Rotation的 X 清0;
5.将摄像机拉到空物体文件夹下。
6.把NewCamera.cs 添加到摄像机。
7.将空物体拉到CameraFather选项,将摄像机拉到Target,Rotateseed是旋转速度,自己输入一个正数,Scalespeed滚轴带动摄像机移动速度,Min和Max都是Scalespeed的大小限制,Min一般是负值,Max一般取正值。(小于取Min值大于取Max值)。把观察的对象拉到Obj选项。Cameraspeed是鼠标靠近屏幕边缘的移动速度。

按键说明
按Space(空格)键锁定视角
按住鼠标左键拖动旋转视角
滚轴改变摄像机和物体距离

 

时间: 2024-08-24 09:34:36

Unity实现游戏中摄像机视角控制的相关文章

Unity制作游戏中的场景

Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity 2D游戏开发从入门到精通清华大学出版社. 要创建一个新的场景,只需单击File|New Scene命令,或者按下快键键Ctrl+N,如图1-16所示. 图1-16  创建程序的命令,以及场景 默认情况下,新创建游戏项目的同时,也新创建了游戏的场景,只不过还没有保存罢了.使用快捷键Ctrl+S即可保

用Unity实现Minecraft中的镜头控制

在学习Unity的过程中,最基本而又最重要的一部分就是镜头控制(Camera Control). 镜头控制就是通过鼠标.键盘等输入设备的操作,来实现在游戏中的导航.在Unity中的本质是通过接收鼠标的移动和键盘的按键,来变换相机对象(Camera)的位置(position)和旋转(rotation),这两个值位于camera的transform组件(conponent)中. 在这里我们通过实现<我的世界>中创造模式的镜头控制方式来学习第一人称的镜头控制. 在我的世界中,镜头的朝向(旋转)是通过

[Unity]制作游戏中名字板的过程记录(未完成)

先大概说一下需求: 1 每个模型上都要有名字板:人.怪.npc等等. 2 名字板上会显示:名字(文字).血条(图片)等 3 因为是透视相机,名字板离得太近会变得超大,且主角移动,名字板的位置相对于相机来说是一直变化的,因此有Update一直在计算名字板的大小以及朝向Camera 刚开始接到需求用的是UGUI+NGUI实现的,每个名字板占用4.5个batches(1种字体+3个图集).但当游戏中怪物多了,10个怪就有差不多50个batches,以后会有更多同屏需求,因为需要改进. 尝试使用Supe

【Unity】游戏中的单例

游戏中需要一些 GameObject(例如网络管理器) 在游戏的整个生命周期都存在,而且是以单例的形式存在. XGame 中实现这种单例的方式是,单例脚本都从 MonoSingle 类继承,MonoSingleton 的实现方法是在 Awake() 中调用DontDestroyOnLoad(gameObject);来保证单例. MonoSingleton类的实现代码: 1 /// <summary> 2 /// Generic Mono singleton. 3 /// </summar

unity中摄像机的控制---调整摄像机,不让他摔倒

摄像机大部分人都会控制,最明显的就是让他旋转,随着鼠标的左右上下移动而旋转,但是总是会遇到一个问题,就是转着转着就仿佛他自己摔倒了似的,其实就是它本身绕着Z轴旋转了 这样就不是我们想要的结果了 要想解决也简单,就是最后修正一下就好 this.transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0); 我这段代码是直接给了相机了,所以用的是this,这样摄像机就不会自己乱转了

Unity跑酷游戏中的路点生成算法

最近做了一个小的跑酷游戏,今天就我前几天写的 游戏玩家跟随在跑道上的路点行走的简单逻辑进行一下梳理,希望大家和我自己都能够有一定的进步. 下面我先说一下该款游戏的一些有必要知道的前提.跑道是动态生成的,而路点又是作为跑道子对象waypoints的子对象(简单而言,就是孙子对象)存在.所以,路点也就是动态创建,动态销毁了.我的思路是在游戏刚刚加载时,由RacetrackGenerator脚本类在初始化时先动态生成两个跑道,而每个跑道都有一个自己的WaypointsManager(路点管理器脚本),

Unity优化方向——在Unity游戏中优化脚本(译)

原文地址:https://unity3d.com/cn/learn/tutorials/topics/performance-optimization/optimizing-scripts-unity-games?playlist=44069 介绍 当我们的游戏运行时,我们设备的中央处理器(CPU)执行指令.游戏的每一帧都需要执行数百万的CPU指令.为了保持平滑的帧率,CPU必须在规定的时间内执行指令.当CPU不能及时执行所有指令时,我们的游戏可能会变慢.卡顿. 许多事情会导致CPU有太多的工作

【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera0: GameObject; private var Camera1: GameObject; private var Camera2: GameObject; private var Camera: GameObject; function Start() { //获取摄像机对象 Camera =

unity中camera摄像头控制详解

目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品是使用unity开发水利BIM(水利建筑信息模型),项目中需要控制摄像 头对模型进行360度查看,请注意所有操作都是移动摄像头,不是移动模型.摄 像头能进行移动.旋转.改变焦距操作,类似于SketchUp的控制操作: 摄像头移动时,根据当前旋转方向(Rotation)进行移动 摄像头距离模型越远,摄