unity脚本中的camera相关代码

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

unity脚本中的camera相关代码

Camera相关代码共有两个脚本,包括CameraContral和Sample_move_Camera

CameraContral全部代码展示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraContral : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

这是一个简单的 Unity 脚本,名为 `CameraContral`,用于控制摄像机的行为。当前的代码中,`Start` 方法和 `Update` 方法均为空,没有具体的实现。

在 `Start` 方法中,你可以进行一次性的初始化,例如设置摄像机的初始位置、旋转、或者获取其他对象的引用。

在 `Update` 方法中,你可以编写代码以处理每一帧的逻辑。这可能包括玩家输入的响应、对象的移动、碰撞检测等等。

Sample_move_Camera全部代码展示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;


public class Sample_move_Camera : MonoBehaviour
{
    public Camera mainCamera;

    public Transform mainCamerLocation;

    public float moveSpeed = 15f;
    public float zoomSpeed = 5f;

    private bool isDragging = false;
    private Vector3 initialMousePosition;
    private Vector3 initialCameraPosition;
    // Start is called before the first frame update
    void Start()
    {
        mainCamera.transform.position = mainCamerLocation.position;
        mainCamera.transform.rotation = mainCamerLocation.rotation;
        DOTween.Init();
    }

    // Update is called once per frame
    void Update()
    {
        SampleMoveControl();
        SampleScrollWheel();
        MouseDragWin();
    }

    void SampleMoveControl()
    {
        if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前
        {
            this.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.S) | Input.GetKey(KeyCode.DownArrow)) //后
        {
            this.transform.Translate(Vector3.up * -moveSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.LeftArrow)) //左
        {
            this.transform.Translate(Vector3.right * -moveSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.D) | Input.GetKey(KeyCode.RightArrow)) //右
        {
            this.transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
        }
    }
    void SampleScrollWheel()
    {
        if (mainCamera.orthographic == true)
        {
            mainCamera.orthographicSize -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        }
        else
        {
            mainCamera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        }
    }
    void MouseDragWin()
    {
        if (Input.GetMouseButtonDown(2)) // 鼠标中键按下
        {
            isDragging = true;
            initialMousePosition = Input.mousePosition;
            initialCameraPosition = transform.position;
        }
        else if (Input.GetMouseButtonUp(2)) // 鼠标中键释放
        {
            isDragging = false;
        }

        if (isDragging)
        {
            Debug.Log("is Dragging");
            Vector3 currentMousePosition = Input.mousePosition;
            Vector3 displacement = Camera.main.ScreenToWorldPoint(currentMousePosition)
                - Camera.main.ScreenToWorldPoint(initialMousePosition);
            transform.position = initialCameraPosition - displacement;
        }
    }
    public void MoveTo (GameObject target)
    {
        Vector3 targetPosition = target.transform.position + new Vector3(0,2250,0);
        this.transform.DOMove(targetPosition,0.25f);
    }
}

上述代码是一个用于控制相机移动和交互的 Unity 脚本。以下是对代码逻辑的简要说明:

1. 初始化设置:
   - 在 `Start` 方法中,设置主相机的位置和旋转为预定义的 `mainCamerLocation` 的位置和旋转。
   - 初始化 DoTween 插件,用于实现平滑的物体移动效果。

2. 输入检测与相机移动:
   - 在 `Update` 方法中,每帧检测用户输入和鼠标操作,包括键盘上的"WASD"和箭头键控制相机的前后左右移动。
   - 如果用户按下鼠标中键(中轴滚轮),则启用拖拽模式,记录初始鼠标位置和相机位置,并在拖拽时更新相机位置,实现鼠标中键拖拽相机的效果。

3. 滚轮缩放:
   - 在 `SampleScrollWheel` 方法中,根据相机是正交还是透视投影,使用鼠标滚轮的输入调整相机的正交大小或透视视野,实现缩放效果。

4. 相机移动到目标位置:
   - 提供一个公共方法 `MoveTo`,用于将相机移动到指定的目标对象上方一定距离,使用 DoTween 插件实现平滑移动。

总体而言,这个脚本允许用户通过键盘控制相机的移动,通过鼠标中键实现拖拽相机的功能,并通过鼠标滚轮实现相机的缩放。同时,提供了一个方法可以将相机移动到指定目标的上方,提供了平滑移动效果。

重点代码段解释:

代码段一 

if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前 
    {this.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);}

问:这里的input是什么意思

答:在这段代码中,Input.GetKey(KeyCode.W)Input.GetKey(KeyCode.UpArrow) 是用于检测键盘输入的条件语句。

  • Input.GetKey(KeyCode.W) 表示检测键盘上的"W"键是否被按下。
  • Input.GetKey(KeyCode.UpArrow) 表示检测键盘上的上箭头键是否被按下。

这两个条件使用 | 运算符进行逻辑或操作,即只要其中一个条件为真,整个条件表达式就为真。所以,这段代码的意思是:如果键盘上的"W"键或上箭头键被按下,就执行花括号中的代码块。

在这里,执行的代码是 this.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);,它的作用是将当前对象(脚本所附着的对象)沿着世界空间的Y轴方向移动一定距离,移动的距离取决于 moveSpeedTime.deltaTime。这通常用于实现相机或玩家角色的上移动作。

问:input是类吗

答:在Unity中,Input 是一个静态类,用于处理用户输入。它提供了一组静态方法和属性,让开发者能够轻松地获取用户的键盘、鼠标、触摸屏等输入。

具体而言,Input 类包含了一系列用于检测输入的静态方法,如:

  • Input.GetKey(KeyCode key): 检测键盘上的某个按键是否被按下。
  • Input.GetKeyDown(KeyCode key): 检测键盘上的某个按键是否刚刚被按下。
  • Input.GetKeyUp(KeyCode key): 检测键盘上的某个按键是否刚刚被释放。
  • Input.GetAxis(string axisName): 获取指定轴的输入值,通常用于处理输入设备的轴,比如鼠标滚轮或手柄摇杆。

这些方法允许开发者在脚本中根据用户的输入来执行相应的操作,例如移动、跳跃、攻击等。 Input 类是 Unity 引擎中用于处理输入的核心类之一。

问:this.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);是什么

答:this.transform.Translate 是一个 Unity 中用于移动物体的方法。让我们分解这个表达式:

  • this: 表示当前脚本所附着的对象(即拥有这个脚本的对象)。
  • transform: 是 GameObject 类中的一个属性,表示对象的变换组件。变换组件包含了有关对象的位置、旋转和缩放的信息。
  • Translate(Vector3 translation): 是变换组件的方法,用于在当前对象的坐标系中移动物体。
  • Vector3.up: 是一个代表世界坐标 Y 轴方向的单位向量。
  • moveSpeed: 是移动的速度,用于确定移动的距离。
  • Time.deltaTime: 是上一帧到当前帧的时间间隔,用于使移动在不同帧之间平滑。

所以,这行代码的效果是在每一帧中将对象沿着 Y 轴方向移动一个距离,使其产生一个平滑的移动效果。

代码段二

void SampleScrollWheel()
    {
        if (mainCamera.orthographic == true)
        {
            mainCamera.orthographicSize -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        }
        else
        {
            mainCamera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        }
    }

问:解释以上代码

答:代码解释如下

void SampleScrollWheel()
{
    // 检查主摄像机是否使用正交投影
    if (mainCamera.orthographic == true)
    {
        // 检查主摄像机是否使用正交投影。如果是正交投影,表示相机的投影方式是平行投影;如果为 false,则相机使用透视投影。
        mainCamera.orthographicSize -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
    }
    else
    {
        // 如果是透视投影,则调整视野大小
        mainCamera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
    }
}

这段代码的效果是根据鼠标滚轮的滚动来动态调整相机的正交投影大小或透视投影视野大小,从而实现缩放效果。

1.mainCamera.orthographic == true: 检查主摄像机是否使用正交投影。如果是正交投影,表示相机的投影方式是平行投影;如果为 false,则相机使用透视投影。

2.如果相机使用正交投影 (orthographic == true),则通过 Input.GetAxis("Mouse ScrollWheel") 获取鼠标滚轮的滚动值,并乘以 zoomSpeed,然后用这个值来调整正交投影的大小 (mainCamera.orthographicSize)。正交投影的大小决定了相机视口的大小。

3.如果相机使用透视投影 (orthographic == false),则同样通过 Input.GetAxis("Mouse ScrollWheel") 获取鼠标滚轮的滚动值,并乘以 zoomSpeed,然后用这个值来调整视野的大小 (mainCamera.fieldOfView)。视野大小影响了相机的可见范围,即视野角度。

代码段三

void MouseDragWin()
{
    if (Input.GetMouseButtonDown(2)) // 鼠标中键按下
    {
        // 记录拖拽开始的状态和位置
        isDragging = true;
        initialMousePosition = Input.mousePosition;
        initialCameraPosition = transform.position;
    }
    else if (Input.GetMouseButtonUp(2)) // 鼠标中键释放
    {
        // 拖拽结束,重置拖拽状态
        isDragging = false;
    }

    if (isDragging)
    {
        // 如果正在拖拽,执行拖拽操作
        Debug.Log("is Dragging");

        // 获取当前鼠标位置
        Vector3 currentMousePosition = Input.mousePosition;

        // 计算鼠标位移
        Vector3 displacement = Camera.main.ScreenToWorldPoint(currentMousePosition)
            - Camera.main.ScreenToWorldPoint(initialMousePosition);

        // 更新相机位置
        transform.position = initialCameraPosition - displacement;
    }
}

问:简述上述代码流程

答:以下是对上述代码的简要说明:

1.首先,检测鼠标中键的按下和释放事件,以确定是否开始或结束拖拽操作。
2.如果鼠标中键按下,则记录拖拽开始的状态和位置,并标记为正在拖拽。
3.如果鼠标中键释放,则重置拖拽状态为未拖拽。
4.如果正在拖拽,则获取当前鼠标位置,并计算鼠标位移向量。
5.最后,根据鼠标的位移向量更新相机的位置,从而实现拖拽效果。

问:Debug.Log("is Dragging");

答:Debug.Log("is Dragging"); 是一个用于在 Unity 编辑器的控制台输出一条调试信息的语句。
       Debug 是 Unity 引擎中的一个类,提供了一系列用于调试的方法。
       Log 是其中的一个方法,用于输出日志信息。
在这行代码中,如果鼠标中键被按下并且正在拖拽相机(isDragging 为 true),那么会输出一条日志信息,内容是 "is Dragging"。这样做有助于在开发过程中追踪程序的执行流程和状态。
在 Unity 编辑器中,你可以打开控制台(Console)来查看这些日志信息。这对于调试程序、查找错误以及理解代码执行流程非常有用。一旦你在代码中使用了 Debug.Log,你就可以在 Unity 编辑器中的控制台看到相应的输出。

问:Vector3 currentMousePosition = Input.mousePosition;

答:Input.mousePosition是 Unity 中的一个属性,用于获取当前帧中鼠标的屏幕坐标位置。这个属性返回一个 Vector3,其中 xy 分别表示鼠标在屏幕上的水平和垂直位置,而 z 通常为 0。

所以,这行代码的作用是获取当前帧中鼠标的屏幕坐标位置,并将其存储在 currentMousePosition 变量中。在鼠标拖拽相机的情境下,这个坐标通常用于计算鼠标的位移,以便更新相机的位置。

问:Vector3 displacement = Camera.main.ScreenToWorldPoint(currentMousePosition) - Camera.main.ScreenToWorldPoint(initialMousePosition);

答:这行代码的目的是计算鼠标在世界坐标中的位移。让我逐步解释:

Vector3 displacement = Camera.main.ScreenToWorldPoint(currentMousePosition) - Camera.main.ScreenToWorldPoint(initialMousePosition);

  1. Camera.main: 这是获取场景中的主摄像机的快捷方式。如果场景中有多个摄像机,这可能需要根据具体情况调整。

  2. ScreenToWorldPoint(Vector3 position): 这是一个方法,用于将屏幕坐标转换为世界坐标。它接受一个 Vector3 参数,其中的 xy 表示屏幕上的点的水平和垂直位置,而 z 通常是摄像机到目标的距离。在这里,我们使用 currentMousePositioninitialMousePosition 作为输入,分别表示鼠标当前位置和初始位置。这行代码计算了两个 Vector3 向量之间的差值,即 Camera.main.ScreenToWorldPoint(currentMousePosition) 减去 Camera.main.ScreenToWorldPoint(initialMousePosition)。这个操作的结果是一个新的 Vector3 向量,表示了从初始鼠标位置到当前鼠标位置的位移向量。每个分量(x、y、z)都分别相减,得到了相应的差值。

  3. displacement: 这是一个 Vector3 变量,表示鼠标从初始位置移动到当前位置的位移。通过将当前鼠标位置的世界坐标减去初始鼠标位置的世界坐标,我们得到一个向量,该向量指示了鼠标的位移方向和大小。

这个 displacement 向量在拖拽相机时非常有用,因为它表示了鼠标在世界空间中的移动量,可以用来更新相机的位置,以实现拖拽效果。文章来源地址https://www.toymoban.com/news/detail-849835.html

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

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

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

相关文章

  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(48)
  • 【Unity 脚本相关】实现脚本之间动态变量传递

    这是我在做作品的过程中遇到的问题,大概阐述一下遇到的问题及解决思路。 因为是做天空盒,有很多变量需要控制,shader之间又想实现颜色、变量的传递,所以整个项目的所有暴露出来的可调整变量,我都汇总在了主脚本Skybox中,并把这个Skybox脚本挂在了Main Camera对象下:

    2024年02月13日
    浏览(27)
  • Unity学习笔记--如何用代码Copy Component并且Paste到其他游戏对象上?

    最近需要在编辑器模式下,用代码实现复制一个组件并且移动到另一个游戏对象上 简单来说就是剪切 通过查询Unity API可以了解到 UnityEditorInternal.ComponentUtility.CopyComponent 。 比如我们想把A游戏对象上的 Rigidbody 组件移动到B游戏对象上 有时候,我们可能需要把一个游戏对象上的

    2024年02月15日
    浏览(31)
  • unity的C#学习——不安全代码(声明不安全代码块:实现C/C++指针的创建与相关操作)

    不安全代码(Unsafe code)是指 使用了指针变量的代码块 ,或者 执行需要访问非托管代码(unmanaged code)的操作 。 指针 是一个变量,其值为另一个变量的地址,即内存位置的直接地址。在C#中,不安全代码必须使用 unsafe 修饰符标记,并需要在编译时启用 AllowUnsafeCode 选项。

    2024年02月09日
    浏览(27)
  • Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动

    教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip Unity 脚本概览 脚本编写并不困难,但是如果直接从细节开始讲起,会让 读者难以看到脚本编程的全貌。因此本章不急于阐述脚本编写 的细节,只介绍简单的修改物体位置、处理用户输入和检测碰 撞的方法

    2024年02月21日
    浏览(51)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(49)
  • Unity 跑酷游戏全部脚本(完结)

    这个脚本是主角身上的脚本,用于检测是否碰到其他触发器,并做出对应的行为    using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColliidisonTrigger : MonoBehaviour {     //触发检测  1.碰到金币克隆区,克隆金币 2.恐克隆怪物  3.碰撞金币 吃掉它 加分 4.碰到

    2024年02月04日
    浏览(28)
  • 游戏引擎中的物理应用

    Character Controller和普通的动态对象(Dynamic Actor )是不同的,主要的三个特点是: 它拥有可控制的刚体间的交互 假设它是有无穷的摩擦力(可以站停在位置上),没有弹性 加速和刹车几乎立即改变方向并传送 所以其实角色控制器其实是反物理的。 1.1 构建一个控制器 首先,这

    2024年04月14日
    浏览(24)
  • 游戏引擎中的物理系统

    1.1 对象 Actor 一般来说,游戏中的对象(Actor)分为以下四类: 静态对象 Static Actor 动态对象 Dynamic Actor ---- 可能受到力/扭矩/冲量的影响 检测器 Trigger Kinematic Actor 运动学对象 ---- 忽略物理法则,由游戏逻辑直接控制(可能表现的反物理) 1.2 形状 Shape 由于真实世界中很多物体

    2024年04月10日
    浏览(25)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包