热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

初学VR(四):如何让相机跟随着角色移动

界面拖拽实现将MainCamera拖拽到第一三人称角色的目录下即可,如图:注意相机应该是MainCamera,因为你可能误把相机删了,然后自己创建了一个相机。你可以点击

界面拖拽实现

将Main Camera 拖拽到 第一/三人称角色的目录下即可,如图:
结果

注意相机应该是Main Camera,因为你可能误把相机删了,然后自己创建了一个相机。你可以点击它,查看 Inspector 的Tag 标签,查看其是否为 MainCamera 。如果不是将其重新选择为MainCamera 即可。

脚本实现

通过创建脚本cameraContorlan ,将其挂载到Main Camera上即可。具体代码将在最后给出(注释非常详细,这的感谢我的刘老师)

创建脚本

在下面的Assets目录下,右键create 选择C # Script即可。
可以创建一个目录来存储脚本文件,文件名应在创建的时候修改好

脚本挂载到物体上

点击 Main Camera 将脚本文件拖拽到其 Inspector 里即可。观察到其会多一个 Script 组件出来。同样,我们也可以通过直接在主相机的 Inspector中 Add Component来实现。

脚本代码

//导入UnitEngine和系统资源
using UnityEngine;
using System.Collections;
//创建一个公有的类,类名和文件名保持一致
/*如果脚本文件名更改了,这个类名也要同时更改*/
public class cameraControlan : MonoBehaviour {

    //定义一个公有变量,表示人物角色
    //物体的类型一般用Transform;变量定义之后需要到Unity窗口下把物体和变量绑定一下
    public Transform Character;

    //定义公有变量表示相机的垂直高度和水平距离
    public float DisUp;
    public float DisAway ;

    //初始化相机实时速度
    public Vector3 speed = Vector3.zero;

    // Use this for initialization
    //初始化函数,程序运行后执行一次s
    void Start () {
        //print ("初始化");
        DisUp = 2f;
        DisAway = 9f;
    }

    // Update is called once per frame
    //这个函数会每一帧执行一次
    void Update () {
        //print ("更新了一帧");
        /*在脚本中,transform表示脚本挂载的物体组件,因为当前脚本挂到了main camera上, 所以transform表示相机的transform组件,简单理解为表示相机。*/
        //transform.postition 指相机的三维坐标
        //让相机的位置移动到人的位置
        //transform.position = Character.position;

        //定义一个坐标,表示相机和角色之间的相对坐标
        //Vector3 表示三维坐标系中的向量
        //c#中,小数后一般加f,表示浮点型
        Vector3 distance = new Vector3(0,DisUp,-DisAway);
        //把相对坐标通过角色的坐标转换为世界坐标
        Vector3 targetPosition = Character.TransformPoint(distance);
        //把获取的目标位置坐标赋值给相机
        transform.position = targetPosition;

        //让相机平滑过渡到目标位置 方法参数:相机现在的位置,相机的目标位置,相机当前的速度,相机的过渡时间
        //ref 关键字对应的参数必须提前初始化,特点是对应的参数值会时时变化。
        transform.position = Vector3.SmoothDamp(transform.position,targetPosition,ref speed,0.5f);
        //让相机正对角色
        transform.LookAt(Character);
    }
}

//脚本必须挂载到物体上才能执行

对于变量 character 需要在 Main Camera的Inspector 界面将其绑定才行。可以看见,在其Script 下多出了一个character,可以直接从scene(目录)窗口将角色拖拽到character后的框里。
也可以选择框后的小圆点来选择角色。

这种在脚本中创建公有变量,在界面中将其绑定以便在代码中获得代表它的变量的操作以后会经常遇到。


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 是否可以从ScriptEngineManager内部访问Java方法。我发现如何使用Invocableinvoke函数方法,但现在我需要相反的事情发生。publicc ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
author-avatar
大华出入境
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有