找回密码
 立即注册
查看: 6036|回复: 82

[脚本] 问:制作类似coc那样的屏幕缩放控制

[复制链接]
发表于 2014-8-14 14:44 | 显示全部楼层 |阅读模式
本帖最后由 aoin 于 2014-8-14 15:27 编辑

问:制作类似coc那样的屏幕缩放,
2个手指,根据手指位置来确定缩放的中心;

我的思路:
FingerGestures.OnPinchMove += FingerGestures_OnPinchMove;

void FingerGestures_OnPinchMove(Vector2 fingerPos1, Vector2 fingerPos2, float delta)    {

       Camera.main.fieldOfView -= delta * 0.5f; //进行缩放处理

        Vector3 cameraCenter = Camera.main.ScreenToWorldPoint(fingerPos1);//获取新的摄像机位置

        Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position,
           cameraCenter, Time.deltaTime * 50);//移动摄像机位置

         adjustFieldOfView(); // 锁定摄像机放大比例    }

问题是cameraCenter,一直不变化,值一直是Camera.main.transform.position;
求更好的思路,或者代码。万谢~
发表于 2014-9-5 10:19 | 显示全部楼层
手机触屏上对摄像机的参数设置来旋转和缩放
//用于绑定参照物对象
var target : Transform;
//缩放系数
var distance = 10.0;
//左右滑动移动速度
var xSpeed = 250.0;
var ySpeed = 120.0;
//缩放限制系数
var yMinLimit = -20;
var yMaxLimit = 80;
//摄像头的位置
var x = 0.0;
var y = 0.0;
//记录上一次手机触摸位置判断用户是在左放大还是缩小手势
private var oldPosition1 : Vector2;
private var oldPosition2 : Vector2;

//初始化游戏信息设置
function Start () {
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;

    // Make the rigid body not change rotation
       if (rigidbody)
        rigidbody.freezeRotation = true;
}

function Update ()
{
    //判断触摸数量为单点触摸
    if(Input.touchCount == 1)
    {
        //触摸类型为移动触摸
        if(Input.GetTouch(0).phase==TouchPhase.Moved)
        {
            //根据触摸点计算X与Y位置
            x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
            y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;

        }
    }

    //判断触摸数量为多点触摸
    if(Input.touchCount >1 )
    {
        //前两只手指触摸类型都为移动触摸
        if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved)
        {
                //计算出当前两点触摸点的位置
                    var tempPosition1 = Input.GetTouch(0).position;
                var tempPosition2 = Input.GetTouch(1).position;
                //函数返回真为放大,返回假为缩小
                if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2))
                {
                    //放大系数超过3以后不允许继续放大
                    //这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改
                       if(distance > 3)
                       {
                           distance -= 0.5;
                       }
                   }else
                {
                    //缩小洗漱返回18.5后不允许继续缩小
                    //这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改
                    if(distance < 18.5)
                    {
                        distance += 0.5;
                    }
                }
            //备份上一次触摸点的位置,用于对比
            oldPosition1=tempPosition1;
            oldPosition2=tempPosition2;
        }
    }
}

//函数返回真为放大,返回假为缩小
function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean
{
    //函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势
    var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y));
    var leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y));
    if(leng1<leng2)
    {
         //放大手势
         return true;
    }else
    {
        //缩小手势
        return false;
    }
}

//Update方法一旦调用结束以后进入这里算出重置摄像机的位置
function LateUpdate () {

    //target为我们绑定的箱子变量,缩放旋转的参照物
    if (target) {        

        //重置摄像机的位置
         y = ClampAngle(y, yMinLimit, yMaxLimit);
        var rotation = Quaternion.Euler(y, x, 0);
        var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;

        transform.rotation = rotation;
        transform.position = position;
    }
}

static function ClampAngle (angle : float, min : float, max : float) {
    if (angle < -360)
        angle += 360;
    if (angle > 360)
        angle -= 360;
    return Mathf.Clamp (angle, min, max);
}

点评

我很懒,只想回复看看,另感谢楼主分享  详情 回复 发表于 2018-6-23 23:23
发表于 2017-2-27 21:58 | 显示全部楼层
很不错
发表于 2017-2-27 22:00 | 显示全部楼层
顶顶多好
发表于 2017-2-27 22:26 | 显示全部楼层
难得一见的好帖
发表于 2017-2-27 21:35 | 显示全部楼层
说的非常好
发表于 2017-2-27 22:14 | 显示全部楼层
LZ真是人才
发表于 2017-3-18 16:42 | 显示全部楼层
很不错
发表于 2017-3-18 17:15 | 显示全部楼层
楼主是超人
发表于 2017-3-18 17:15 | 显示全部楼层
好帖就是要顶
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-13 16:03 , Processed in 0.108707 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表