Unity控制相机旋转、移动、缩放等功能

这篇具有很好参考价值的文章主要介绍了Unity控制相机旋转、移动、缩放等功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity控制相机旋转、移动、缩放等功能


提示: 该脚本允许你以指定的速度和角度围绕模型进行相机旋转,并可以控制相机的移动和缩放

操作说明

将该脚本添加到一个游戏对象上,并将其作为主摄像机。

1、在Unity编辑器中,你可以在脚本的参数变量部分调整相机的速度、缩放和移动等设置。根据需求,修改各个参数的值。

2、如果需要使相机跳转到指定的模型位置,可以使用MoveToMod(string modName)方法。在调用该方法时,传入目标模型的名称作为参数。相机将会立即跳转到该模型的位置。

3、如果想让相机围绕指定模型以指定速度旋转一定角度,可以使用CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow)方法。在调用该方法时,传入目标模型的名称、x轴旋转角度、y轴旋转角度、z轴旋转角度、旋转速度和是否跟随模型旋转的参数。相机将会以指定的速度逐渐旋转至目标角度。

4、如果需要限制相机的移动范围,可以根据参数变量部分的移动限制设置来调整xMaxMove、xMinMove、yMaxMove、yMinMove、zMaxMove和zMinMove的值。相机将不能超出这些范围进行移动。

参数变量

xSpeed和ySpeed:相机旋转的速度。
wheelSpeed:相机缩放的速度。
xMoveSpeed和yMoveSpeed:相机移动的速度。
isUnlimitedScale:是否无限制放大,但仍受移动限制所规定的范围影响。
distance:镜头与中心点之间的距离,在isUnlimitedScale为true时有效。
isCameraMovementAllowed、isCameraRotationAllowed和isCameraZoomAllowed:是否允许移动、旋转和缩放相机。
isPositionLimitEnabled:是否开启位置限制。
maxZoom和minZoom:缩放的最大和最小限制。
xMaxMove、xMinMove、yMaxMove、yMinMove、zMaxMove和zMinMove:移动的限制。

公共方法

MoveToMod(string modName):使相机跳转到指定模型。
CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow):使相机以指定速度围绕指定模型旋转一定角度。

私有方法

AnimateCameraRotation(float targetX, float targetY, float targetZ, float velocity, bool follow):执行相机旋转动画的协程。
UpdateCameraPosition():更新相机的位置。
MoveCameraSideways(float mouseX):更新相机的横向平移。
MoveCameraUpwards(float mouseY):更新相机的纵向平移。
UpdateCameraRotation():更新相机的旋转。
UpdateCameraZoom():更新相机的缩放。

Unity回调方法

Start():在脚本开始时获取当前物体的Transform作为中心点物体。
Update():每帧更新相机的位置、旋转和缩放。

操作:
按住鼠标右键并拖动鼠标来旋转相机。
按住鼠标中键并拖动鼠标来移动相机。
使用鼠标滚轮来缩放相机。
长按shift镜头上移
长按ctrl镜头下移文章来源地址https://www.toymoban.com/news/detail-761805.html

using UnityEngine;

public class Rotation : MonoBehaviour
{
    // -----  参数变量 -----

    [Header("旋转速度")]
    public float xSpeed = 125.0f;
    public float ySpeed = 60.0f;

    [Header("缩放速度")]
    public float wheelSpeed = 50;

    [Header("移动速度")]
    public float xMoveSpeed = 200;
    public float yMoveSpeed = 200;

    [Header("是否无限制放大,但仍旧会受移动限制所规定的范围")]
    public bool isUnlimitedScale = true;

    [Header("镜头与中心点距离,在 isUnlimitedScale 变量为 true 时有效")]
    public float distance = 30;

    [Header("是否允许移动相机")]
    public bool isCameraMovementAllowed = true;

    [Header("是否允许旋转相机")]
    public bool isCameraRotationAllowed = true;

    [Header("是否允许缩放相机")]
    public bool isCameraZoomAllowed = true;

    [Header("是否开启位置限制")]
    public bool isPositionLimitEnabled = true;

    [Header("缩放限制,最大,最小")]
    public float maxZoom = 300;
    public float minZoom = 8;

    [Header("移动限制")]
    public float xMaxMove = 94;
    public float xMinMove = -94;
    public float yMaxMove = 58;
    public float yMinMove = 1;
    public float zMaxMove = 44;
    public float zMinMove = -44;

    // ----- 内部变量 -----

    private Transform tanks; // 中心点物体
    private Quaternion rotation; // 角度控制

    // ----- 公共方法 -----

    // 使相机跳转到模型
    public bool MoveToMod(string modName)
    {
        if (string.IsNullOrEmpty(modName))
            return false;

        Transform newTransform = GameObject.Find(modName)?.transform;

        if (newTransform != null)
        {
            tanks.position = newTransform.position;
            return true;
        }
        else
        {
            return false;
        }
    }

    // 使相机以指定速度围绕指定模型旋转一定角度
    public void CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow)
    {
        MoveToMod(modName);

        // 设置旋转角度
        float targetX = transform.eulerAngles.x + xAngle;
        float targetY = transform.eulerAngles.y + yAngle;
        float targetZ = transform.eulerAngles.z + zAngle;

        // 开启协程执行动画
        StartCoroutine(AnimateCameraRotation(targetX, targetY, targetZ, velocity, follow));
    }

    // ----- 私有方法 -----

    // 协程,执行相机旋转动画
    private System.Collections.IEnumerator AnimateCameraRotation(float targetX, float targetY, float targetZ, float velocity, bool follow)
    {
        float animationSpeed = velocity;

        while (true)
        {
            float step = animationSpeed * Time.deltaTime;

            // 逐渐旋转至目标角度
            transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(targetX, targetY, targetZ), step);

            if (follow)
                tanks.rotation = transform.rotation;

            yield return null;
        }
    }

    // 更新相机的位置
    private void UpdateCameraPosition()
    {
        if (!isCameraMovementAllowed || !Input.GetMouseButton(2))
            return;

        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = Input.GetAxis("Mouse Y");

        // 横向平移
        MoveCameraSideways(mouseX);

        // 纵向平移,若相机垂直地面则向前平移
        MoveCameraUpwards(mouseY);
    }

    // 更新相机的横向平移
    private void MoveCameraSideways(float mouseX)
    {
        transform.Translate(Vector3.right * xMoveSpeed * Time.deltaTime * -mouseX);
        tanks.Translate(Vector3.right * xMoveSpeed * Time.deltaTime * -mouseX);
    }

    // 更新相机的纵向平移
    private void MoveCameraUpwards(float mouseY)
    {
        transform.Translate(Vector3.up * yMoveSpeed * Time.deltaTime * -mouseY);
        tanks.Translate(Vector3.up * yMoveSpeed * Time.deltaTime * -mouseY);
    }

    // 更新相机的旋转
    private void UpdateCameraRotation()
    {
        if (!isCameraRotationAllowed || !Input.GetMouseButton(1))
            return;

        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = Input.GetAxis("Mouse Y");

        // 设置横向旋转距离
        float x = transform.eulerAngles.x + mouseY * xSpeed * 0.02f;

        // 设置纵向旋转距离
        float y = transform.eulerAngles.y + mouseX * ySpeed * 0.02f;

        rotation = Quaternion.Euler(y, x, transform.eulerAngles.z);

        transform.rotation = rotation;
    }

    // 更新相机的缩放
    private void UpdateCameraZoom()
    {
        if (!isCameraZoomAllowed)
            return;

        if (isUnlimitedScale)
        {
            float scrollDelta = Input.GetAxis("Mouse ScrollWheel");

            // 方块与相机保持相应距离
            distance += scrollDelta * wheelSpeed;
        }
        else
        {
            float scrollDelta = Input.GetAxis("Mouse ScrollWheel");

            if ((scrollDelta < 0 || distance > minZoom) && (scrollDelta > 0 || distance < maxZoom) || !isPositionLimitEnabled)
            {
                distance += scrollDelta * wheelSpeed;
            }
        }

        rotation = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y, 0);
        transform.position = rotation * new Vector3(0.0f, 0.0f, -distance) + tanks.position;
    }

    // ----- Unity 回调方法 -----

    private void Start()
    {
        tanks = transform; // 使用当前物体的 Transform,而不是寻找名为 "Main Camera" 的对象
    }

    private void Update()
    {
        UpdateCameraPosition();
        UpdateCameraRotation();
        UpdateCameraZoom();
    }
}

到了这里,关于Unity控制相机旋转、移动、缩放等功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity-第三人称摄像机简单脚本(包括跟随、视角旋转、滚轮缩放)

    本菜鸟为了实现第三人称视角摄像机的主要功能,踩了很多意料之外的坑,终于搞出一份自觉完美的脚本,分享一下。 功能:摄像机跟随、鼠标滚轮缩放视野、长按鼠标右键左右旋转视野、长按鼠标中键上下旋转视野。 此脚本挂接在摄像机上,有详细注释,可直接运行。

    2024年02月08日
    浏览(67)
  • Unity摄像机旋转与移动脚本实现

            最近做项目经常用到需要控制摄像机的地方,查阅了网上的方法后,以自己的需要写了一个这样的功能。希望对码友有所帮助        (本脚本放在摄像机上)         摄像机脚本功能:           1、通过键盘的WASD键控制摄像机的前后左右移动           2、通过

    2024年02月13日
    浏览(42)
  • 【Unity】摄像机跟随鼠标移动以物体为中心旋转 物体根据视线方向移动

    描述 实现摄像机根据鼠标移动跟随物体旋转,以摄像机前物体为中心,摄像机围绕物体旋转,并使摄像机时刻指向物体 实现效果 Unity 组件设置 Camera 组件设置 Body 组件设置 实现代码 CameraRotateMove.cs 摄像机跟随和旋转 move_better.cs 物体根据按键移动

    2024年02月08日
    浏览(90)
  • Unity【角色/摄像机移动控制】【3.摄像机跟随角色】

    本章代码基于前两章。 1. 我们新建CameraController脚本,将其挂载到Camera上 2. 在角色Player下新建一个空物体,命名为cameraTargetPoint,并将该物体挂载至CameraController脚本中【注意代码中的这行:public Transform cameraTargetPoint;】,将该空物体放在人物头部附近位置 3.将PlayerController脚本

    2024年02月22日
    浏览(52)
  • Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

    本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。 提示:这里可以添加技术名词解释 直接上代码 后期可扩展功能:类似点击目标完成视角移动等。

    2024年02月07日
    浏览(57)
  • Unity 控制摄像机镜头的上下左右移动

            private float FollowPosx,FollowPosy;     private float moveAmount=5;   //控制镜头的移动速度     // Update is called once per frame     void Update()     {         if (Input.mousePosition.y Screen.height * 0.9)//如果鼠标位置在顶部,就向上移动         {             FollowPosy += moveAmount * Time.delta

    2024年02月11日
    浏览(50)
  • Unity【角色/摄像机移动控制】【2.角色跟随鼠标转向】

    本章代码实现基于本系列的【1.角色移动】 在前面的基础上,我们在PlayerController脚本中添加如下函数,随后在update方法中调用即可: 其中mouseSensitivity是前面自定义的一个float变量,用来调节对鼠标转向速度,至此,当我们转动鼠标,角色也会跟着转动

    2024年02月22日
    浏览(57)
  • Unity鼠标控制3D物体的移动、旋转、缩放

    1.使用协程 2.鼠标左键控制物体移动,鼠标碰到物体,物体颜色改变 1. 控制物体左右旋转,上下旋转 2. 控制摄像机以物体为中心旋转 脚本挂载到摄像机上 1. 基于物体本身的Transform的缩放 2. 基于摄像机的远近的缩放 脚本挂载到摄像机上

    2024年02月11日
    浏览(52)
  • Unity 通过键盘鼠标控制物体移动、旋转、缩放的方法

    在Unity中,使用键盘ADWS键控制物体移动,通过鼠标左键控制物体旋转,鼠标中键控制物体缩放是再常见不过的方法。 方法如下:  效果如下:Unity 通过键盘鼠标控制物体移动、旋转、缩放_哔哩哔哩_bilibili

    2024年02月03日
    浏览(50)
  • Unity相机绕物体旋转、视野缩放功能的c#脚本实现(模拟物品展台功能),且相机参数可调

    为了实现照相机的物品展台功能,查询了网上各种各样的方法,有的需要导入资源包什么的,觉得都比较复杂。 代码部分参考了一位大佬的文章,这里附上文章链接。 ———————————————— 版权声明:本文为CSDN博主「董豪强」的原创文章,遵循CC 4.0 BY-SA版权协

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包