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 向量在拖拽相机时非常有用,因为它表示了鼠标在世界空间中的移动量,可以用来更新相机的位置,以实现拖拽效果。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>