脚本作为组件挂在摄像机上即可,调用接口开关IsControlMove,控制是否启用;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems; public class CameraMove : MonoBehaviour { //public Transform target;
public Vector3 target;
private Vector3 offset;
private bool IsControlMove;
private Vector3 _position = Vector3.zero;
private Quaternion _rotation = Quaternion.identity;
private float _xAngles = 0.0f;
private float _yAngles = 0.0f;
private float m_xAngles = 0.0f;
private float m_yAngles = 0.0f;
private float m_xSpeed = 100f;
private float m_ySpeed = 100f;
//Limit
private float m_xMinValue = -15f;
private float m_xMaxValue = 15;
private float m_yMinValue = -15;
private float m_yMaxValue = 15;
private float m_limitChangeTime = 3.0f;
void Awake ()
{
//Init
Vector3 myCameraAngles = transform.eulerAngles;
_xAngles = myCameraAngles.y;
_yAngles = myCameraAngles.x;
_position = transform.position;
_rotation = transform.rotation;
m_xAngles = myCameraAngles.y;
m_yAngles = myCameraAngles.x;
offset = transform.position - target;
}
void LateUpdate () {
if (IsControlMove)
{
if (Application.platform == RuntimePlatform.WindowsEditor)
{
if (Input.GetMouseButton(0) && !EventSystem.current.IsPointerOverGameObject())
{
CameraChange();
}
if (Input.GetMouseButtonUp(0))
{
InitDataOfCamera();
}
}
else if (Application.platform == RuntimePlatform.Android ||
Application.platform == RuntimePlatform.IPhonePlayer)
{
if (Input.touchCount == 1)
{
if (Input.touches[0].phase == TouchPhase.Moved)
{
//Move
CameraChange();
}
}
if (Input.touches[0].phase == TouchPhase.Ended && Input.touches[0].phase != TouchPhase.Canceled)
{
InitDataOfCamera();
}
}
}
}
public void CameraChange()
{
m_xAngles -= Input.GetAxis("Mouse X") * m_xSpeed * 0.02f;
m_xAngles = Mathf.Clamp(m_xAngles, m_xMinValue, m_xMaxValue);
m_yAngles += Input.GetAxis("Mouse Y") * m_ySpeed * 0.02f;
m_yAngles = Mathf.Clamp(m_yAngles, m_yMinValue, m_yMaxValue);
var rotation = Quaternion.Euler(m_yAngles, m_xAngles, 0);
Vector3 position = rotation * offset + target;
transform.rotation = rotation;
transform.position = position;
}
/// <summary>
/// Init Data
/// </summary>
public void InitDataOfCamera()
{
m_xAngles = _xAngles;
m_yAngles = _yAngles;
transform.position = Vector3.Lerp(transform.position, _position, m_limitChangeTime);
transform.rotation = Quaternion.Slerp(transform.rotation, _rotation, m_limitChangeTime);
}
public void OnCameraControl(bool value)
{
IsControlMove = value;
}
}

  

unity 调整摄像机视角完整脚本的更多相关文章

  1. [Unity菜鸟] 摄像机视角控制

    1. 摄像机预览物体 上下左右远近 把CameraFollow脚本赋给Camera,把要观察的对象赋给target using UnityEngine; using System.Collection ...

  2. C#开发Unity游戏教程之使用脚本变量

    C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...

  3. 【学习中】Unity插件之NGUI 完整视频教程

    课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控 ...

  4. Unity学习疑问记录之脚本生命周期

    总的来说unity的脚本生命周期分几个部分:编辑→初始化→游戏逻辑→渲染→GUI→Teardown首先是Reset,顾名思义:重置.在什么情况下调用呢?1.用户第一次添加组件时.2用户点击见组件面板上 ...

  5. Unity NGUI 网络斗地主 -发牌 脚本交互

    Unity NGUI 网络斗地主 -发牌 脚本交互 @By 灰太龙 Unity4.2.1f4 NGUI 3.0.4 本篇说的问题是脚本与控件的交互! 现在对界面进行了改进,先看副图! 1.制作发牌效果 ...

  6. Unity 3d C#和Javascript脚本互相调用 解决方案(非原创、整理资料,并经过实践得来)

    Unity 3d C#和Javascript脚本互相调用 解决方案 1.背景知识 脚本的编译过程分四步: 1. 编译所有 ”Standard Assets”, “Pro Standard Assets ...

  7. unity中鼠标左键控制摄像机视角上下左右移动

    enum RotationAxes { MouseXAndY, MouseX, MouseY } RotationAxes axes = RotationAxes.MouseXAndY; //@Hid ...

  8. unity实现用鼠标右键控制摄像机视角上下左右移动

    using System;using System.Collections.Generic;using UnityEngine;public class ViewControl{ enum Rotat ...

  9. 关于Unity单个对象多个脚本的Update调用的时序问题

    先说几句废话, 最近在研究Unity, 这玩意用起来比较简单, 而且商店里还有各种插件, 初学者也能轻松拼凑出一个像模像样的游戏(顺便说一句,自己做着玩就无所谓了,但随便拼凑个辣鸡丢出来骗钱就不好了) ...

随机推荐

  1. Django主线

    Django怎么学: 参考地址:https://www.zhihu.com/question/26235428 需要了解的知识点: Django Url请求流程 首要操作 Django的安装 pip3 ...

  2. Fiddler的安装与使用

    Fiddler是位于客户端和服务器端之间的代理,也是目前最常用的抓包工具之一 .它能够记录客户端和服务器之间的所有 请求,可以针对特定的请求,分析请求数据.设置断点.调试web应用.修改请求的数据,甚 ...

  3. vue 常用手册

    基本使用 引入vue.js 创建Vue对象, 指定选项对象 el : 指定dom标签容器的选择器 data : 指定初始化状态属性数据的对象对象/函数(返回一个对象) 页面中 使用v-model: 实 ...

  4. Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal

    原文链接http://www.cnblogs.com/zhouzhendong/p/9010945.html 题目传送门 - Codechef STMINCUT 题意 在一个有边权的无向图中,我们定义 ...

  5. python josn包

    Python josn包中的编码与解码方法 对于Python数据类型进行编码解码 json.dumps  对python的数据类型进行json格式编码 :(将dict转为json格式) eg: imp ...

  6. URL简介

    一般来说,http请求都会和URL地址有关,那么今天就来说说URL的组成部分. 实例:http://192.168.1.12/phpwind/searcher.php?keyword=phpwind& ...

  7. 日志组件slf4j介绍及配置详解

    http://blog.csdn.net/foreverling/article/details/51385128

  8. TensorFlow卷积层-函数

    函数1:tf.nn.conv2d是TensorFlow里面实现卷积的函数,实际上这是搭建卷积神经网络比较核心的一个方法 函数原型: tf.nn.conv2d(input,filter,strides, ...

  9. --mysql 导出数据时, 数字类型的列如果位数过长,变为科学计数法问题

    --mysql 导出数据时, 数字类型的列如果位数过长,变为科学计数法问题在字段前加上\t即可select concat('\t',a.IDCARD_NO) from xxx a

  10. 安卓开发中SpannableString之富文本显示效果

    SpannableString其实和String一样,都是一种字符串类型,SpannableString可以直接作为TextView的显示文本,不同的是SpannableString可以通过使用其方法 ...