Unity3D多个UI按钮更改主摄像机位置NOT SCENE

如何解决Unity3D多个UI按钮更改主摄像机位置NOT SCENE

使用多个UI按钮尝试将主摄像机位置更改为不同的视图。我不想改变场景。我正在看一个物体,比如说一辆汽车,我想看到前照灯,我想单击一个按钮来移动主摄像机以看到前照灯,并有一个弹出窗口显示文本“ HeadLights”。然后,我想移至BrakeLights,单击“断灯”按钮,然后主摄像机移至“断灯”区域,并弹出另一个文本,显示“断灯”。每个汽车零件都有多个按钮,我很困惑,而且刚开始寻求帮助。

解决方法

如果我对您的理解正确,则有多个按钮,单击每个按钮会将主摄像机移动到与该按钮相对应的位置。您应该做的是:

  1. 创建一个脚本,该脚本存储要显示的文本以及相机的位置和旋转。将其附加到每个按钮的游戏对象上。

  2. 然后,在该脚本中创建一个函数来设置文本和相机的位置/旋转角度。该脚本应如下所示:


using UnityEngine;
using UnityEngine.UI;

public class CameraSwitch : MonoBehaviour
{
    public Text UILabel;
    public string text;
    public Vector3 cameraPos;
    public Vector3 cameraRot;

    public void SwitchToHere()
    {
        Camera.main.transform.position = cameraPos;
        Camera.main.transform.rotation = Quaternion.Euler(cameraRot);
        UILabel.text = text;
    }
}

  1. 返回Unity。在每个按钮的OnClick事件中,订阅(添加)刚创建的功能。 (确保从该按钮所附的脚本中添加功能)

  2. 将文本更改为所需的文字,然后在按此按钮时将cameraPos和cameraRot设置为希望相机切换到的位置。


这是我做完所有事情的视频:https://youtu.be/L621IcEBAtU

这肯定会起作用,但是每个点之间的过渡是即时的。如果要平稳过渡,可以使用电影机包或更改脚本。

,

如果愿意,您可以为每个位置创建两个Vector3,一个用于您希望照相机所处的位置,另一个用于您希望照相机对面。

public Vector3 cameraPos;
public Vector3 cameraLootAkPos;

public void ChangeCameraTransform()
{
    Camera.main.transform.position = cameraPos;
    Camera.main.transform.LookAt(cameraLootAkPos);
}

如果您想使用它,我做了自己的版本。上面的版本是一个即时过渡,下面包含的过渡在运行时更平稳。您可以考虑使用Mathf.Lerp

public class ChangeCamera : MonoBehaviour
{
    // You can populate each list with the appropriate positions. Making sure they are in order from 0 upward
    public List<Vector3> CameraPositions;
    public List<Vector3> CameraLookAtPositions;

    public Vector3 LookAtTarget;

    // to see which camera configuration we should use.
    public int CamConfig;

    float moveSpeed = .5f;
    float rotSpeed = .5f;

    public Transform MainCamera;

    void Update()
    {
        if (MainCamera.position != CameraPositions[CamConfig])
        {
            MainCamera.position = Vector3.MoveTowards(MainCamera.position,CameraPositions[CamConfig],moveSpeed);
        }
        LookAtTarget = Vector3.MoveTowards(LookAtTarget,CameraLookAtPositions[CamConfig],rotSpeed);
        MainCamera.LookAt(LookAtTarget);
    }

    public void ChangeCameraConfig(int ConfigNo)
    {
        CamConfig = ConfigNo;
    }
}
,

作为练习,我试图编写一个简单的C#脚本来完成如上所述的操作。希望这对您自己有所帮助:

using UnityEngine;

public class CamSwitcher : MonoBehaviour {

    public CamSpotInfo[] spots;
    [Range(0.1f,3.0f)] public float anim_speed = 0.3f;
    protected int idx = 0;
    protected float t_accum = 0.0f;

    void Update() {
        Transform cam = Camera.main.transform;
        cam.position = Vector3.Lerp(cam.position,spots[idx].transform.position,t_accum);
        cam.LookAt(spots[idx].target); /* TODO: interpolate target positions */
        t_accum += Time.deltaTime * anim_speed;
    }

    void OnGUI() {
        if (GUI.Button(new Rect(10,70,200,30),"next spot: " + spots[idx].name)) {
            if (++idx >= spots.Length)
                idx = 0;
            t_accum = 0.0f;
        }
    }
}

[System.Serializable]
public class CamSpotInfo {
    public Transform transform;
    public Transform target;
    public string name;
}

为了给阵列分配新的“相机点”,请首先在Unity检查器中手动设置“大小”,然后将新的GameObjects /变换从场景“层次结构”窗口拖动到检查器中阵列的各个元素(例如,这些可以只是表示每个“摄影机位置”的摄影机位置的空游戏对象。然后将摄像机目标分配给数组中的每个元素,您希望主摄像机查看每个“摄像机点”(例如,车轮)。最后,为将在GUI按钮上显示的每个元素输入名称。

在此示例中,在“播放模式”中将仅显示一个GUI按钮,该按钮用于切换到阵列中的下一个“位置”。但是您可以轻松地修改脚本,以使相机直接切换到特定元素...

CameraSwitcher script component in Unity's Inspector window

(不确定此网站是否真的是一个很好的问题,因为它是开放式的,因为有很多不同的方法可以为该功能提出可能的解决方案(涉及许多不同领域,例如相机运动控制器,路径插补,GUI等)。


编辑:多个GUI按钮

这是上面脚本的修改版本,它使用多个GUI按钮,每个摄像头一个。可以通过“显示GUI”复选框在检查器中启用/禁用每一个:

using UnityEngine;

public class CamSwitcher : MonoBehaviour {

    public CamSpotInfo[] spots;
    [Range(0.1f,3.0f)] public float animSpeed = 0.3f;
    protected uint idx = 0;
    protected float t = 0.0f;

    void Update() {
        Transform cam = Camera.main.transform;
        Vector3 dir_target = spots[idx].target.position - cam.position;
        Quaternion roti = Quaternion.LookRotation(dir_target);
        cam.position = Vector3.Lerp(cam.position,t);
        cam.rotation = Quaternion.Slerp(cam.rotation,roti,t);
        t += Time.deltaTime * animSpeed;
    }
    void OnGUI() {
        Rect rect = new Rect(10,30);
        for (uint i=0; i<spots.Length; ++i) {
            if (spots[i].showGUI) {
                if (GUI.Button(rect,"switch to " + spots[i].name)) {
                    idx = i;
                    t = 0.0f;
                }
                rect.y += rect.height + 5;
            }
        }
    }
}

[System.Serializable]
public class CamSpotInfo {
    public Transform transform;
    public Transform target;
    public string name;
    public bool showGUI = true;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-