Unity C# 一些关于Camera的心得!
本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6856374.html
首先,总结了下最近工作中关于摄像机漫游的功能,
脚本如下:
Transform _Camera;
public LayerMask mask; public float checkHeight = 500f;
public float minHeight = 20f;
public float maxHeight = 8000f;
public float minClamp = 50f;
public float maxClamp = 950f; public float sensitivityX = 5f;
public float sensitivityY = 5f;
private float rotationY = 0f; //上下最大Y视角
public float minimumY = -90f;
public float maximumY = 30f; public Vector3 PreMouseMPos; public float scrollSpeed = 200f; void Start ()
{
mask.value = ;
_Camera = Camera.main.transform;
} // Update is called once per frame
void Update ()
{
if(Input.GetKey(KeyCode.LeftAlt))
{
MouseScrollWheel ();
CameraMove ();
MoveEulerAngles ();
}
} /// <summary>
/// Checks the height of the low.
/// </summary>
void CheckLowHeight()
{
if (_Camera.position.x < minClamp)
_Camera.position = new Vector3 (minClamp, _Camera.position.y, _Camera.position.z);
if (_Camera.position.x > maxClamp)
_Camera.position = new Vector3 (maxClamp, _Camera.position.y, _Camera.position.z);
if (_Camera.position.z < minClamp)
_Camera.position = new Vector3 (_Camera.position.x, _Camera.position.y, minClamp);
if (_Camera.position.z > maxClamp)
_Camera.position = new Vector3 (_Camera.position.x, _Camera.position.y, maxClamp); RaycastHit hit;
if(Physics.Raycast(_Camera.position+Vector3.up*checkHeight,Vector3.down,out hit ,checkHeight+minHeight,mask))
{
if(_Camera.position.y-hit.point.y<minClamp)
{
Vector3 lowPoint = hit.point + new Vector3 (, minHeight, );
_Camera.position = lowPoint;
}
}
} /// <summary>
/// Mouses the scroll wheel.
/// </summary>
private void MouseScrollWheel()
{
if(Input.GetAxis("Mouse ScrollWheel")!=)
{
_Camera.Translate (new Vector3 (, , Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * scrollSpeed));
} CheckLowHeight (); if (_Camera.position.y >= maxHeight)
_Camera.position = new Vector3 (_Camera.position.x, maxHeight, _Camera.position.z);
} /// <summary>
/// Cameras the move.
/// </summary>
private void CameraMove()
{
if(Input.GetMouseButton())
{
if(PreMouseMPos.x<=)
{
PreMouseMPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, );
}
else
{
Vector3 CurMouseMPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, );
Vector3 offset = CurMouseMPos - PreMouseMPos;
offset = -offset * 0.5f * ;
if((_Camera.position+offset).y>=minHeight
&&(_Camera.position+offset).y<=maxHeight)
{
_Camera.Translate(offset); CheckLowHeight(); PreMouseMPos = CurMouseMPos;
}
}
}
else
PreMouseMPos = Vector3.zero;
} /// <summary>
/// Moves the euler angles.
/// </summary>
private void MoveEulerAngles()
{
if(Input.GetMouseButton())
{
float rotationX = _Camera.localEulerAngles.y + Input.GetAxis ("Mouse X") * sensitivityX; rotationY += Input.GetAxis ("Mouse Y") * sensitivityY; rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); _Camera.localEulerAngles = new Vector3 (-rotationY, rotationX, );
}
}
MoveRocket
第二个是关于摄像机的限制范围和遇到障碍物自动变换与target的距离的功能
代码如下:
public Transform target;
public LayerMask mask = new LayerMask();
public Vector2 targetOffset = new Vector2();
public Vector2 originRotation = new Vector2();
public float distance = ;
public float minDistance = ;
public float maxDistance = ;
public Vector2 sensitivity = new Vector2(, );
public float zoomSpeed = ;
public float zoomSmoothing = ;
public float minAngle = -;
public float maxAngle = ;
private float _zoom_in_timer = ;
private float _zoom_out_timer = ;
private float _wanted_distance;
private Quaternion _rotation;
private Vector2 _input_rotation;
private Transform _t;
void Start()
{
mask.value = ;
_t = transform;
_wanted_distance = distance;
_input_rotation = originRotation; }
void Update()
{
if (target) {
if (Input.GetMouseButton () || Input.GetMouseButton ()) {
if (Input.GetAxis ("Mouse X") != || Input.GetAxis ("Mouse Y") != ) {
if (!Cursor.visible) {
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
}
}
return;
}
}
if (!Cursor.visible) {
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
}
}
void FixedUpdate()
{
if(target)
{
// Zoom control
if(Input.GetAxis("Mouse ScrollWheel") < )
{
_wanted_distance += zoomSpeed;
}
else if(Input.GetAxis("Mouse ScrollWheel") > )
{
_wanted_distance -= zoomSpeed;
}
_wanted_distance = Mathf.Clamp(_wanted_distance, minDistance, maxDistance);
if (Input.GetMouseButton () || Input.GetMouseButton ()) {
_input_rotation.x += Input.GetAxis ("Mouse X") * sensitivity.x;
ClampRotation ();
_input_rotation.y -= Input.GetAxis ("Mouse Y") * sensitivity.y;
_input_rotation.y = Mathf.Clamp (_input_rotation.y, minAngle, maxAngle);
_rotation = Quaternion.Euler (_input_rotation.y, _input_rotation.x, );
}
// Lerp from current distance to wanted distance
distance = Mathf.Clamp(Mathf.Lerp(distance, _wanted_distance, Time.deltaTime * zoomSmoothing), minDistance, maxDistance);
// Set wanted position based off rotation and distance
Vector3 wanted_position = _rotation * new Vector3(targetOffset.x, , -_wanted_distance - 0.2f) + target.position + new Vector3(, targetOffset.y, );
Vector3 current_position = _rotation * new Vector3(targetOffset.x, , ) + target.position + new Vector3(, targetOffset.y, );
// Linecast to test if there are objects between the camera and the target using collision layers
RaycastHit hit;
if(Physics.Linecast(current_position, wanted_position, out hit, mask))
{
distance = Vector3.Distance(current_position, hit.point) - 0.2f;
}
// Set the position and rotation of the camera
_t.position = _rotation * new Vector3(targetOffset.x, 0.0f, -distance) + target.position + new Vector3(, targetOffset.y, );
_t.rotation = _rotation;
}
}
private void ClampRotation()
{
if(originRotation.x < -)
{
originRotation.x += ;
}
else if(originRotation.x > )
{
originRotation.x -= ;
}
if(_input_rotation.x - originRotation.x < -)
{
_input_rotation.x += ;
}
else if(_input_rotation.x - originRotation.x > )
{
_input_rotation.x -= ;
}
}
Unity C# 一些关于Camera的心得!的更多相关文章
- [Unity] How to stop camera rendering?
http://answers.unity3d.com/questions/147988/how-to-pause-the-main-camera-.html I would simply pause ...
- Unity 3D 之贪吃蛇 Text 心得 & Audio
当我们需要在游戏街面上增加文本时, 我们就需要用到Text 组件 注意: 当文本的长度或者宽度不够时,字体将无法显示. 因为是面对组件编程,所以每一个组件的component都可以同过GetCompo ...
- 一次UNITY闪退问题的定位心得
最近项目测试发现,运行unity后不退出运行模式,玩了一局后点击 “再来一局”,反复十几局后unity崩掉. 经观察,发现在这十几局的过程中,unity占用内存不断上升,由3.2G左右上升到3.6G左 ...
- Unity仪表盘显示UGUI制作小心得
最近在做设备仪表参数参数显示,由于模型摆放位置经常修改,加之要求不能在模型的下面添加东西,显示界面的位置也不得不跟着修改,一来二去就烦了,想了解决办法,现在总结如下: 1.仍然在模型下面新建Panel ...
- 制作和unity调用动态链接库dll文件
首先用vc建立一个dll工程 然后在里面建立一个testunity.h文件.内容如下 1 extern "C" int _declspec(dllexport)testunity( ...
- [原]Unity3D深入浅出 - 摄像机组件(Camera)
在Unity中创建一个Camera后,除了默认带一个Transform组件外,还会附带Flare Layer.GUI Layer.Audio Listener等4个组件,如下图. ClearFlags ...
- Unity 坐标 转换 详解 World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标
在制作游戏中我们经常会遇到这样一个需求: 在人物模型的上面显示 名字.称号 一类的文字或者图片 如下图 人物模型属于是Camera1 UI Title信息属于NGUI Camera2 如下图 这时 ...
- Unity和Android混合开发
通用的流程 https://blog.csdn.net/zhangdi2017/article/details/65629589 应用场景 Unity游戏中一些功能需要安卓系统的支持,如搜索wifi等 ...
- Unity事件处理机制与NGUI事件机制
1 Unity原生 1.1 GUI void OnGUI(){ if(GUI.Button(Rect position, string text)){ //点击后立即执行 } 1.1 Input 每个 ...
随机推荐
- 开始学习yii2第一天
今天在朋友圈看到一条转发,内容是根据招聘网站的要求,列举了需要一个php工程师具体需要哪些技能 框架要求是yii2 出现的最多 已经出来工作了快半个月了,感觉工资还是少的可怜,而且我也好想去张江, 所 ...
- 将spring cloud打包docker镜像
简介:用spring cloud构建微服务后,微服务肯定要docker镜像化然后用rancher等可视化工具管理,这就是走完了一套基本的流程,现在简单介绍下 环境:两台centos7.x的服务器,一台 ...
- 读书笔记 effective c++ Item 41 理解隐式接口和编译期多态
1. 显示接口和运行时多态 面向对象编程的世界围绕着显式接口和运行时多态.举个例子,考虑下面的类(无意义的类), class Widget { public: Widget(); virtual ~W ...
- shiro使用教程
一.shiro是什么 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.不仅可以在Web项目中使用,在普通的项目中也是可以使用的 二.shiro可以做什 ...
- GEF开发eclipse插件,多页编辑器实现delete功能
基于GEF开发,多页签编辑器实现 有两种方案: 方案一 继承FormEditor或MultiPageEditorPart,在其中嵌入自定义的继承自GraphicalEditor的子类的编辑器(作为一个 ...
- Android 开发之错误整理 [2014-04-28 09:22:28 - XXXX] Unable to resolve target 'android-18'
在开发的时候难免会导入项目,那么怎么经常会遇到这个错误: [2014-04-28 09:22:28 - XXXX] Unable to resolve target 'android-18' targ ...
- 深入浅出数据结构C语言版(7)——特殊的表:队列与栈
从深入浅出数据结构(4)到(6),我们分别讨论了什么是表.什么是链表.为什么用链表以及如何用数组模拟链表(游标数组),而现在,我们要进入到对线性表(特意加了"线性"二字是因为存在多 ...
- 移动端emoji图标的存储和显示
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6694595.html 一.emoji是什么 绘文字(日语:絵文字/えもじ emoji)是日本在无线通信中所使用的 ...
- 学习Sass笔记之概念篇
1 什么是CSS预处理器 首先我们了解一下什么是CSS预处理器:通俗的说,“CSS 预处理器用一种专门的编程语言,进行 Web 页面样式设计,然后再编译成正常的 CSS 文件,以供项目使用.CSS 预 ...
- start with connect by prior 递归查询用法,很实用
当开发过程需要查询上下级机构类似的树形机构,还有就是查询当前等级下的所有所属节点 这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点. 先看原始 ...