24.Camera摄像机代码控制

24.Unity重要组件和API-Camera代码控制


24.1 知识点

获取摄像机

可以用之前的知识来获取摄像机。

重要静态成员

main静态变量 获取主摄像机
// 第一个启用的摄像机标记为“MainCamera”。(只读)
// 如果想通过这种方式快速获取摄像机,那么场景上必须有一个 tag为MainCamera的摄像机,否则为空报错。
// 如果场景上有多个 tag为MainCamera的摄像机,那么这样获取到的摄像机对象无法确定是哪一个。
print(Camera.main);
print(Camera.main.name);
allCamerasCount静态变量 获取摄像机的数量
// 当前场景中的摄像机数。
print(Camera.allCamerasCount);
allCameras静态变量 得到所有启用的摄像机
// 返回场景中所有已启用的摄像机。
Camera[] allCameras = Camera.allCameras;
print(allCameras.Length);
渲染相关的委托
onPreCull静态变量 摄像机剔除前处理的委托函数
// onPreCull静态变量 - 摄像机剔除前处理的委托函数
// 任意摄像机开始剔除前触发的事件。
// 摄像机有个遮罩剔除的选项可以不渲染被挡住的对象,提高性能。这个事件就是在剔除前做的委托。
Camera.onPreCull += (c) =>
{
    // 在这里编写处理逻辑
};
onPreRender静态变量 摄像机渲染前处理的委托
// onPreRender静态变量 - 摄像机渲染前处理的委托
// 任意摄像机开始渲染前触发的事件。
Camera.onPreRender += (c) =>
{
    // 在这里编写处理逻辑
};
onPostRender静态变量 摄像机渲染后处理的委托
// onPostRender静态变量 - 摄像机渲染后处理的委托
// 任意摄像机完成渲染后触发的事件。
Camera.onPostRender += (c) =>
{
    // 在这里编写处理逻辑
};

重要成员

界面上的参数都可以在Camera类中获取到。比如下面这句代码就是得到主摄像机对象上的深度进行设置。就不一一列举了,用到了可以查官方API。

depth变量 设置摄像机的深度

// 摄像机在摄像机渲染顺序中的深度。
Camera.main.depth = 10;

WorldToScreenPoint方法 世界坐标转屏幕坐标

// 将position从世界空间变换为屏幕空间。
// 转换过后x和y对应的就是屏幕坐标,z对应的是这个3D物体里我们的摄像机有多远。
// 我们会用这个来做的功能最多的就是头顶血条相关的功能。
Vector3 v = Camera.main.WorldToScreenPoint(this.transform.position);
print(v);

ScreenToWorldPoint方法 屏幕坐标转世界坐标

// 将点从屏幕空间变换为世界空间。其中,世界空间定义为位于游戏层级视图最顶层的坐标系统。
// 只所以改变Z轴是因为如果不改Z默认为0。
// 转换过去的世界坐标系的点永远都是一个点,可以理解为视口相交的焦点。
// 如果改变了Z,那么转换过去的世界坐标的点就是相对于摄像机前方多少的单位的横截面上的世界坐标点。
// 在Update内:
Vector3 v = Input.mousePosition;
v.z = 5;
sphere.position = Camera.main.ScreenToWorldPoint(v);
// 这样这个球体一直会在离摄像机5米的横截面上跟着鼠标移动。
print(Camera.main.ScreenToWorldPoint(v));

24.2 知识点代码

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

public class Lesson24_Camera代码相关 : MonoBehaviour
{
    public Transform sphere;
    
    void Start()
    {
        #region 知识点一 重要静态成员

        //获取摄像机
        //可以用之前的知识 来获取摄像机

        //main静态变量 获取主摄像机
        //第一个启用的摄像机标记为“MainCamera”。(只读)
        //如果想通过这种方式 快速获取摄像机
        //那么场景上必须有一个 tag为MainCamera的摄像机 否则为空报错
        //如果场景上有多个 tag为MainCamera的摄像机 那么这样获取到的摄像机对象无法确定是哪一个
        print(Camera.main);
        print(Camera.main.name);

        //allCamerasCount静态变量 获取摄像机的数量
        //当前场景中的摄像机数。
        print(Camera.allCamerasCount);

        //allCameras静态变量 得到所有启用的摄像机
        //返回场景中所有已启用的摄像机。
        Camera[] allCameras = Camera.allCameras;
        print(allCameras.Length);

        //渲染相关的委托

        //onPreCull静态变量 摄像机剔除前处理的委托函数
        //任意摄像机开始剔除前触发的事件。
        //摄像机有个遮罩剔除的选项 可以不渲染被挡住的对象提高性能 这个事件就是在剔除前做的委托
        Camera.onPreCull += (c) =>
        {

        };

        //onPreRender静态变量 摄像机渲染前处理的委托
        //任意摄像机开始渲染前触发的事件。
        Camera.onPreRender += (c) =>
        {

        };

        //onPostRender静态变量 摄像机渲染后处理的委托
        //任意摄像机完成渲染后触发的事件。
        Camera.onPostRender += (c) =>
        {

        };

        #endregion

        #region 知识点二 重要成员

        //界面上的参数 都可以在Camera类中获取到
        //比如 下面这句代码 就是得到主摄像机对象 上的深度 进行设置
        //就不一一列举了 用到了可以查官方API

        //depth变量 设置摄像机的深度
        //摄像机在摄像机渲染顺序中的深度。
        Camera.main.depth = 10;

        //WorldToScreenPoint方法 世界坐标转屏幕坐标
        //将 position 从世界空间变换为屏幕空间。
        //转换过后 x和y对应的就是屏幕坐标 z对应的 是 这个3D物体 里我们的摄像机有多远
        //我们会用这个来做的功能 最多的 就是头顶血条相关的功能
        Vector3 v = Camera.main.WorldToScreenPoint(this.transform.position);
        print(v);

        #endregion
    }

    void Update()
    {
        #region 知识点二 重要成员

        //ScreenToWorldPoint方法 屏幕坐标转世界坐标
        //将点从屏幕空间变换为世界空间。其中,世界空间定义为位于游戏层级视图最顶层的坐标系统。
        //只所以改变Z轴 是因为 如果不改 Z默认为0
        //转换过去的世界坐标系的点 永远都是一个点 可以理解为 视口 相交的焦点
        //如果改变了Z 那么转换过去的 世界坐标的点 就是相对于 摄像机前方多少的单位的横截面上的世界坐标点
        //Update内
        Vector3 v = Input.mousePosition;
        v.z = 5;
        sphere.position = Camera.main.ScreenToWorldPoint(v);
        //这样这个球体一直会在离摄像机5米的横截面上跟着鼠标移动
        print(Camera.main.ScreenToWorldPoint(v));

        #endregion
    }
}

24.3 练习题

游戏画面中央有一个立方体,请将该立方体的世界坐标系位置,转换为屏幕坐标,并打印出来

// 这个脚本挂载到目标立方体上
print(Camera.main.WorldToScreenPoint(this.transform.position));

在屏幕上点击一下鼠标,则在对应的世界坐标位置创建一个Cube出来

// Update内
if (Input.GetMouseButtonDown(0))
{
    GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
    Vector3 v = Input.mousePosition;
    // 一定要设置Z值
    v.z = 20;
    obj.transform.position = Camera.main.ScreenToWorldPoint(v);
}

24.4 练习题代码

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

public class Lesson24_练习题 : MonoBehaviour
{ 
    void Start()
    {
        #region 练习题一

        //1.游戏画面中央有一个立方体,请将该立方体的世界坐标系位置,转换为屏幕坐标,并打印出来

        //这个脚本挂载到目标立方体上
        print(Camera.main.WorldToScreenPoint(this.transform.position));

        #endregion
    }

    void Update()
    {
        #region 练习题二

        //2.在屏幕上点击一下鼠标,则在对应的世界坐标位置 创建一个Cube出来

        //Update内
        if (Input.GetMouseButtonDown(0))
        {
            GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
            Vector3 v = Input.mousePosition;
            //一定要设置Z值
            v.z = 20;
            obj.transform.position = Camera.main.ScreenToWorldPoint(v);
        }

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏