查看: 1216|回复: 1
打印 上一主题 下一主题

[其他] PC鼠标控制相机脚本

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-11-27 04:02:21 |只看该作者 |倒序浏览
using UnityEngine;

//用于产品展示类的相机脚本,拖拽旋转.滚轮放大缩小.带惯性缓冲效果.
public class MouseFollowRotation : MonoBehaviour
{
    public Transform target;
    public float xSpeed = 200, ySpeed = 200, mSpeed = 10;
    public float yMinLimit = -50, yMaxLimit = 50;
    public float distance = 2, minDistance = 2, maxDistance = 30;
   
    public bool needDamping = true;
    float damping = 5.0f;

    public float x = 0.0f;
    public float y = 0.0f;

    public void SetTarget(GameObject go)
    {
        target = go.transform;
    }

    void Start()
    {
        Vector3 angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;
    }

    void Update()
    {
        if (target)
        {
            //鼠标左键旋转相机
            if (Input.GetMouseButton(0))
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

                y = ClampAngle(y, yMinLimit, yMaxLimit);

                //print(Input.GetAxis("Mouse X"));
                //print( Input.GetAxis("Mouse Y"));
                //print(x);
                //print(y);
            }

            //鼠标滚轮拉近拉远相机
            distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed;
            distance = Mathf.Clamp(distance, minDistance, maxDistance);

            //计算相机新的旋转角度和距离位置
            Quaternion rotation = Quaternion.Euler(y, x, 0.0f);
            Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
            Vector3 position = rotation * disVector + target.position;

            //调整相机
            if (needDamping)    //是否使用缓冲效果
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
                transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
            }
            else
            {
                transform.rotation = rotation;
                transform.position = position;
            }

            //鼠标右键移动目标物体
            if (Input.GetMouseButton(1))
            {
                target.transform.Translate(Time.deltaTime * this.mSpeed *Input.GetAxis("Mouse X"), 0, 0, Camera.main.transform);
                target.transform.Translate(0, Time.deltaTime * this.mSpeed * Input.GetAxis("Mouse Y"), 0);
            }
            return;
        }
    }

    //钳制角度
    static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-11-27 06:02:37 |只看该作者
good code !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-16 16:23 , Processed in 0.162095 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部