2D 摄像机跟随的套路
来源:互联网 发布:淘宝代购 编辑:程序博客网 时间:2024/06/06 13:19
跟随最基本套路:
float y = Mathf.Clamp(target.posistion.y, minY, maxY);
(Camera)transform.position = new Vector(x,y,transform.position.z);
更简单的情况下,甚至不需要处理 Y 轴
更好一点的跟随效果,并不希望摄像机时时跟随物体移动,而是在摄像机与跟随物体之间满足一定的条件才移动摄像机,如:
// 先取得摄像机的初始位置
float cameraX = transform.position.x;
// 跟随时使用了平滑处理,而不是直接将跟随物体的 position 赋值给摄像机,即给一个中间值,让跟随效果更自然
if(Mathf.Abs(transform.position.x - target.position.x) > value)
cameraX = Mathf.Lerp(transform.position.x, target.position.x, soomth * Time.deltaTime);
if(Mathf.Abs(transform.position.y - target.position.y) > value)
cameraX = Mathf.Clamp(cameraX, minX, maxX);
transform.position = new Vector3(cameraX,cameraY, transform.position.z);
无外乎就是在限制摄像机的边界范围的情况下,让摄像机的 position 通过一系列处理 (比如判断条件、平滑等,甚至不作处理) 跟随物体的 position
最简单的跟随:
float x = Mathf.Clamp(target.posistion.x, minX, maxX);float y = Mathf.Clamp(target.posistion.y, minY, maxY);
(Camera)transform.position = new Vector(x,y,transform.position.z);
更简单的情况下,甚至不需要处理 Y 轴
更好一点的跟随效果,并不希望摄像机时时跟随物体移动,而是在摄像机与跟随物体之间满足一定的条件才移动摄像机,如:
// 先取得摄像机的初始位置
float cameraX = transform.position.x;
float cameraY = transform.position.y;
// 跟随时使用了平滑处理,而不是直接将跟随物体的 position 赋值给摄像机,即给一个中间值,让跟随效果更自然
if(Mathf.Abs(transform.position.x - target.position.x) > value)
cameraX = Mathf.Lerp(transform.position.x, target.position.x, soomth * Time.deltaTime);
if(Mathf.Abs(transform.position.y - target.position.y) > value)
cameraY = Mathf.Lerp(transform.position.y, target.position.y, soomth * Time.deltaTime);
cameraX = Mathf.Clamp(cameraX, minX, maxX);
cameraY = Mathf.Clamp(cameraY, minY, maxY);
transform.position = new Vector3(cameraX,cameraY, transform.position.z);
上面的示例中,边界的参数需要手动设置,另一种思路如下:
绘制一个 3D Collider (不会与 2D Collider 产生碰撞),利用这个 Collider 来确定边界
摄像机能移动到的坐标为这个 collider 边界的位置再扣除掉摄像机可视区域的一半,因为摄像机的坐标为中心点 (摄像机中心移到边界上,岂不是已经出了场景了)
public class CameraFollow : MonoBehaviour{ public Transform target; public GameObject range; private Collider rangeCol; private Camera thisCamera; void Awake() { rangeCol = range.GetComponent<Collider>(); thisCamera = GetComponent<Camera>(); } // Update is called once per frame void Update() { float distance = Mathf.Abs(transform.position.z); // 计算摄像机可视区域宽度与高度的一半 float visibleHeight = distance * Mathf.Tan(thisCamera.fieldOfView * 0.5f * Mathf.Deg2Rad); float visibleWidth = visibleHeight * thisCamera.aspect; Vector3 minRange = rangeCol.bounds.min; Vector3 maxRange = rangeCol.bounds.max; // 限制可移动范围 float x = Mathf.Clamp(target.position.x, minRange.x + visibleWidth, maxRange.x - visibleWidth); float y = Mathf.Clamp(target.position.y, minRange.y + visibleHeight, maxRange.y - visibleHeight); transform.position = new Vector3(x, y, transform.position.z); }}
阅读全文
0 0
- 2D 摄像机跟随的套路
- 2d摄像机跟随脚本
- Unity3D 2D游戏摄像机的跟随实现
- 摄像机的跟随
- unity摄像机跟随的脚本
- 平滑的2D摄像机
- Unity 3D--摄像机平滑跟随(方法一)
- Unity 3D--摄像机平滑跟随(方法二)
- Unity 3D--摄像机平滑跟随(方法一)
- Unity 3D--摄像机平滑跟随(方法二)
- Unity 3d 实现物体跟随摄像机视野运动
- Unity 3D--摄像机平滑跟随(方法一)
- ugui物体随着摄像机跟随3d场景物体显示
- 一个简单的摄像机跟随脚本
- unity中摄像机的跟随移动
- 如何让摄像机跟随你的角色
- jMonkeyEngine译文 FlagRush5(2)——跟随的摄像机(ChaseCamera)
- 摄像机跟随人拍照
- Maven教程【整理】-(3)-依赖机制/ 自定义到本地库
- Oracle存储过程(1)
- java之单例模式
- ARToolkit在ubuntu14.04下的完整配置
- Lintcode70 Binary Tree Level Order Traversal II solution 题解
- 2D 摄像机跟随的套路
- postMan模拟ajax请求
- Webpack基本概念Loader
- 阿里90后工程师,如何用AI程序写出双11打call歌?
- VS中通过map文件找到崩溃的代码行
- 栈与堆的区别
- 腾讯云迁移工具--笔记小结
- oracle通过时间查询
- geoip+php演示样例:通过ip,获取国家名称和代码