Unity相机自由移动脚本

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

实现WSAD移动方向,鼠标右键旋转角度,滚轮实现缩放

在此之前,我们先讲清楚几个比较容易混淆的点:

1:Transform.forward是Transform组件的一个Vector3类型的属性,代表游戏对象在世界坐标系中的朝向,即“前方向”,它的值是(0,0,1),它表示了一个对象的X轴方向,一般用于计算游戏对象前进的方向,比如用于移动、旋转和射线检测等场景。

2:Transform.Right的数学表达式是(1, 0, 0)。它表示了一个对象的X轴方向,或者说是它的右侧方向

值得注意的是,它们都是单位向量,一般只用于方向计算

3:Input.GetAxis("Horizontal")和Input.GetAxis("Vertical"),input.GetAxis("Mouse X")

它们是分别获取水平方向输入和竖直方向输入的函数,这个函数会返回一个范围在-1到1之间的浮点数,表示当前水平方向上的输入状态

比如Input.GetAxis("Mouse X") 返回鼠标在水平方向上的移动,以浮点数表示。当鼠标向右移动时,返回正值;当鼠标向左移动时,返回负值。如果鼠标不动,返回0

Input.GetAxis("Mouse ScrollWheel"),向前滚动是正数,向后滚动时负数

4:欧拉角和四元数

在unity中的rotation就是使用了欧拉角,欧拉角指的是以三个轴为基准,通过绕不同轴的旋转角度来表示一个物体的旋转状态,通常有XYZ、ZYX、ZXY等多种旋转顺序。但是,欧拉角会存在万向锁问题,即在某些特定情况下,两个轴的旋转会发生重合,导致旋转计算异常

四元数则是通过四元数的定义和运算来实现旋转,四元数实际上是一个四元组,包含了一个实部和三个虚部。它们的定义方式和欧拉角不同,可以避免万向锁问题,并且旋转顺序不会影响旋转结果。四元数还可以通过插值运算实现平滑旋转,适用于需要连续旋转的情况。

我把代码分成了三块

第一个模块是WSAD控制前后左右,这段比较简单,直接定义一个V3类型的移动方向,再使用Translate即可

第二个模块是使用QE控制上下视角,定义一个变量upDown,每次按键时候改变1,然后直接把位置赋值到相机位置即可

第三个模块是使用鼠标右键进行旋转,设置两个旋转向量rotateX,rotateY,Y方向旋转限值minAngle和maxAngle,然后把向量和速度加到相机的欧拉角即可

有一个难点,在刚开始调试的时候,第一次点击鼠标右键进行旋转时,屏幕一直跳动,最后经过GPT的帮助,最终解决了问题!爱死GPT

using UnityEngine;
public class CameraController : MonoBehaviour
{
    //WSAD相机移动速度
    public float moveSpeed = 1.0f;
    //相机当前移动方向
    private Vector3 moveDirection;

    //QE相机的目标高度
    private float upDistance;
    public float upSpeed = 0.2f;

    //鼠标右键控制旋转
    private float rotateX,rotateY;
    public float sensitivity =0.5f;
    //控制鼠标在Y方向上的限值
    public float minAngle = -90f;
    public float maxAngle = 90f;
    //记录之前的欧拉角,避免跳屏
    private Vector3 currentRotation,lastPosition;

    //鼠标滚轮控制缩放
    public float zoomSpeed = 10f;
    private float zoomDistance = 0f;

    private void Start()
    {
            currentRotation = transform.eulerAngles;
    }
    void Update()
    {
        // 使用WSAD控制相机前后左右移动比较简单,直接获取当前的移动方向,然后使用Translate移动即可
        {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            transform.Translate(moveDirection * moveSpeed * Time.deltaTime);
        }

        //使用QE控制相机的上下,使用unDown参数进行单位变化
        {
            if (Input.GetKey(KeyCode.Q))
            {
                upDistance -= upSpeed * Time.deltaTime;
                transform.Translate(transform.up * upDistance, Space.World);
            }
            else if(Input.GetKeyUp(KeyCode.Q))
            {
                upDistance = 0;
            }
            if (Input.GetKey(KeyCode.E))
            {
                upDistance += upSpeed * Time.deltaTime;
                transform.Translate(transform.up * upDistance, Space.World);
            }
            else if(Input.GetKeyUp(KeyCode.E))
            {
                upDistance = 0;
            }
        }

        //使用鼠标右键来控制相机旋转
        //Mouse X,向右移动返回正值,Mouse Y,向上移动鼠标为正值
        {
            if (Input.GetMouseButtonDown(1))
            {
                // 记录当前的欧拉角
                //currentRotation = transform.eulerAngles;
                //记录鼠标位置
                lastPosition = Input.mousePosition;
            }
            if (Input.GetMouseButton(1))
            {
                //设置偏移量
                Vector3 offset = Input.mousePosition - lastPosition;
                rotateX += offset.x * sensitivity;
                rotateY -= offset.y * sensitivity;

                //给Y方向的旋转加上限值函数
                rotateY = Mathf.Clamp(rotateY, minAngle, maxAngle);
                //改变当前的欧拉角
                transform.eulerAngles = new Vector3(rotateY, rotateX, 0f);

                // 将保存的欧拉角重新赋值回去
                transform.eulerAngles += currentRotation;
                lastPosition = Input.mousePosition;
            }
        }
        //使用滚轮来控制物体的缩放
        {
            //获取滚轮的滚动幅度和方向
            zoomDistance += Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
            //使用限值函数来限定缩放的范围
            zoomDistance = Mathf.Clamp(zoomDistance, -10f, 10f);
            //最后定位
            transform.position = transform.position + transform.forward * Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        }
    }
}

直接将代码复制,挂到Camera即可运行!文章来源地址https://www.toymoban.com/news/detail-486377.html

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

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

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

相关文章

  • Unity摄像机旋转与移动脚本实现

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

    2024年02月13日
    浏览(42)
  • Unity3D相机围绕物体自由旋转

    写了一个相机围绕物体360°自由旋转的脚本,比较实用,分享出来给大家使用,配置如下: Hierarchy界面  LookPovit:为物体Auto Aircraft的中心空对象; AroundPovit:用于相机的空对象,作为父类,主要作用是为了保持与被观察物体的位置一致,可防止Auto Aircraft出现抖动而影响相机

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

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

    2024年02月11日
    浏览(44)
  • 【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测

    《Unity5实战-使用C#和Unity开发多平台游戏》第二章-构建一个让你置身3D空间的演示 鼠标观察/键盘控制移动飞行/行走/碰撞检测 Unity版本:2019.4.23f1c1 注意脚本名称和组件添加,不在文章中一一强调 场景模型都是在资源商店选择的免费下载(选择Sort by Price(Low to High)排序)搜索

    2024年02月04日
    浏览(54)
  • Unity面向新手,如何使物体移动,让物体自由的动起来。几种移动方案讲解

    在大部分的Unity游戏开发中,移动是极其重要的一部分,移动的手感决定着游戏的成败,一个优秀的移动手感无疑可以给游戏带来非常舒服的体验。而Unity中有多种移动方法,使用Transform,使用刚体Rigidbody,使用CharacterController,使用NavMesh导航系统等等等等。当然,对于新手来

    2024年02月08日
    浏览(67)
  • Unity之手游UI的点击和方向移动

    一 Button的点击 1.1 新建UI - Button 1.2  在Button上面右击添加空物体 1.3  创建脚本挂载到空物体上面  脚本内容添加点击方法,来控制物体的显示隐藏 1.4 按钮上On Click的位置关联空物体,并选择空物体的脚本方法OnMyClick() 1.5 运行后就可能控制物体显示隐藏了 二 方向键控制移 动

    2024年01月21日
    浏览(52)
  • unity通过脚本实现漫游功能 wasd控制玩家移动,空格跳跃,鼠标控制视野旋转,滑轮控制镜头伸缩

    将场景中的摄像机删除,在玩家的控制面板中添加Camera组件,和rigibody组件   using System.Collections; using System.Collections.Generic; using UnityEngine; public class move : MonoBehaviour {     public float speed;     Rigidbody rigid;     void Start()     {                 rigid = GetComponentRigidbody();     }  

    2024年02月10日
    浏览(46)
  • Unity之物体触碰墙面后随机方向移动

    目录 一、效果图 二、脚本思路 1.随机方向  2.物体移动 3.墙壁检测 三、界面布局 利用父物体旋转移动会影响其子物体的特性制作,在场景中创建三个物体一个用于移动的物体Obj,一个用于旋转的“标杆”物体 pole,一个是负责记录方向的点 Point 物体,其中Point是pole的父物体

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

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

    2024年02月08日
    浏览(91)
  • Unity3D方向键控制人物移动的代码

    也可以换成 Translate 函数默认模式是 Space.Self ,此时移动方向需要为人物坐标系下的人物前进方向 Vector3(0, 0, 1) ;如果模式指定为 Space.World ,移动方向应该为世界坐标系下的人物前进方向 transform.forward , transform.forward 在人物转向过程中会改变。如果不注意这个问题,人物转

    2024年02月11日
    浏览(63)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包