unity3d中使用DoTween来控制2D摄像机视口的移动
2016-12-13 00:09
555 查看
using UnityEngine;
using System.Collections;
public class CameraMove : MonoBehaviour {
public Camera mMapCamera;
private float mMapWidth;
private float mMapHeight;
public Transform mMapRoot;
// Use this for initialization
void Start () {
mMapHeight = mMapCamera.pixelHeight;
mMapWidth = mMapCamera.pixelWidth;
}
// Update is called once per frame
void Update () {
}
public void MoveCameraToPosition(Vector3 pos, float time = 2.0f, Callback callback = null)
{
if (mMapCamera != null)
{
pos = Vector3.right * pos.x + Vector3.up * pos.y + Vector3.forward * mMapCamera.transform.localPosition.z;
{
float cameraSize = mMapCamera.orthographicSize;
float rightX = Screen.width * cameraSize / Screen.height;
float rightY = cameraSize;
Vector3 cameraPos = pos;
Vector2 maxWorldPos = new Vector2(rightX, rightY);
Vector2 maxLocalPos = mMapRoot.InverseTransformPoint(maxWorldPos);
float minX = maxLocalPos.x;
float minY = maxLocalPos.y;
float maxX = mMapWidth - maxLocalPos.x;
float maxY = mMapHeight - maxLocalPos.y;
float x = Mathf.Clamp(cameraPos.x, minX, maxX);
float y = Mathf.Clamp(cameraPos.y, minY, maxY);
float pox = x;
float poy = y;
if (x >= maxX)
{
pox = maxX;
}
else if (x <= minX)
{
pox = minX;
}
if (y >= maxY)
{
poy = maxY;
}
else if (y <= minY)
{
poy = minY;
}
pos = Vector3.right * pox + Vector3.up * poy + Vector3.forward * pos.z;
}
var tweem = mMapCamera.transform.DOLocalMove(pos, time);
tweem.OnComplete(() =>
{
if (callback != null)
{
callback();
}
});
VerifyPosition();
}
}
bool VerifyPosition()
{
float cameraSize = mMapCamera.orthographicSize;
float rightX = Screen.width * cameraSize / Screen.height;
float rightY = cameraSize;
Vector3 cameraPos = mMapCamera.transform.localPosition;
Vector2 maxWorldPos = new Vector2(rightX, rightY);
Vector2 maxLocalPos = mMapRoot.InverseTransformPoint(maxWorldPos);
float minX = maxLocalPos.x;
float minY = maxLocalPos.y;
float maxX = mMapWidth - maxLocalPos.x;
float maxY = mMapHeight - maxLocalPos.y;
float x = Mathf.Clamp(cameraPos.x, minX, maxX);
float y = Mathf.Clamp(cameraPos.y, minY, maxY);
mMapCamera.transform.localPosition = new Vector3(x, y, cameraPos.z);
return x >= maxX || x <= minX || y >= maxY || y <= minY;
}
}
using System.Collections;
public class CameraMove : MonoBehaviour {
public Camera mMapCamera;
private float mMapWidth;
private float mMapHeight;
public Transform mMapRoot;
// Use this for initialization
void Start () {
mMapHeight = mMapCamera.pixelHeight;
mMapWidth = mMapCamera.pixelWidth;
}
// Update is called once per frame
void Update () {
}
public void MoveCameraToPosition(Vector3 pos, float time = 2.0f, Callback callback = null)
{
if (mMapCamera != null)
{
pos = Vector3.right * pos.x + Vector3.up * pos.y + Vector3.forward * mMapCamera.transform.localPosition.z;
{
float cameraSize = mMapCamera.orthographicSize;
float rightX = Screen.width * cameraSize / Screen.height;
float rightY = cameraSize;
Vector3 cameraPos = pos;
Vector2 maxWorldPos = new Vector2(rightX, rightY);
Vector2 maxLocalPos = mMapRoot.InverseTransformPoint(maxWorldPos);
float minX = maxLocalPos.x;
float minY = maxLocalPos.y;
float maxX = mMapWidth - maxLocalPos.x;
float maxY = mMapHeight - maxLocalPos.y;
float x = Mathf.Clamp(cameraPos.x, minX, maxX);
float y = Mathf.Clamp(cameraPos.y, minY, maxY);
float pox = x;
float poy = y;
if (x >= maxX)
{
pox = maxX;
}
else if (x <= minX)
{
pox = minX;
}
if (y >= maxY)
{
poy = maxY;
}
else if (y <= minY)
{
poy = minY;
}
pos = Vector3.right * pox + Vector3.up * poy + Vector3.forward * pos.z;
}
var tweem = mMapCamera.transform.DOLocalMove(pos, time);
tweem.OnComplete(() =>
{
if (callback != null)
{
callback();
}
});
VerifyPosition();
}
}
bool VerifyPosition()
{
float cameraSize = mMapCamera.orthographicSize;
float rightX = Screen.width * cameraSize / Screen.height;
float rightY = cameraSize;
Vector3 cameraPos = mMapCamera.transform.localPosition;
Vector2 maxWorldPos = new Vector2(rightX, rightY);
Vector2 maxLocalPos = mMapRoot.InverseTransformPoint(maxWorldPos);
float minX = maxLocalPos.x;
float minY = maxLocalPos.y;
float maxX = mMapWidth - maxLocalPos.x;
float maxY = mMapHeight - maxLocalPos.y;
float x = Mathf.Clamp(cameraPos.x, minX, maxX);
float y = Mathf.Clamp(cameraPos.y, minY, maxY);
mMapCamera.transform.localPosition = new Vector3(x, y, cameraPos.z);
return x >= maxX || x <= minX || y >= maxY || y <= minY;
}
}
相关文章推荐
- unity3d开发2d游戏中控制摄像机移动以及主角移动
- 在unity3d开发2d游戏控制摄像机移动以及主角移动的方法
- unity3d阶段性学习脚本代码(2个是摄像机跟随(2D游戏中的),1个是角色跳跃移动脚本)
- unity3d中使用精灵sprite创建并控制2d动画
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
- 008-实现Unity3d中使用LeanTouch插件进行触屏控制(拖拽、移动、缩放旋转...)
- Unity3D 使用 A 星寻路(摄像机移动、缩放优化)
- Unity中使用鼠标控制相机的视口方向以及移动
- unity3D中使用鼠标控制物体移动的方法
- Unity3D开发之控制摄像机移动
- 【unity3D】鼠标控制camera的移动、放大(俯视浏览效果、LOL摄像机移动效果)
- Unity3D-ScrollView中使用Layout布局后用代码如何控制ScrollView移动到指定位置
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
- Unity 2D战棋类 摄像机的局部移动控制
- Unity3D鼠标控制摄像机“左右移动控制视角+WASD键盘控制前后左右+空格键抬升高度”脚本
- Unity3D -- 使用可移动图片作为3D背景
- 使用UNIX系统下部分控制代码进行tab移动的代码
- 学习使用easelJS类库控制HTML5游戏角色的移动和跳跃
- Unity3D研究院之获取摄像机的视口区域
- unity3d控制物品的移动(鼠标或上下左右WASD)