1 简介

相机用于渲染游戏对象,每个场景中可以有多个相机,每个相机独立成像,每个成像都是一个图层,最后渲染的图层在最前面显示。

相机的属性面板如下:

  • Clear Flags:设置清屏颜色,Skybox(天空盒)、Solid Color(纯色)、Depth Only(仅深度,画中画效果)、Don't Clear(不渲染);
  • Background:清屏颜色,当 Clear Flags 为 Skybox 或 Solid Color 时,才有 Background;
  • Culling Mask:剔除遮蔽,选择相机需要绘制的对象层;
  • Projection:投影方式,Perspective(透视投影)、Orthographic(正交投影);
  • Field of View:相机视野范围,默认 60°,视野范围越大,能看到的物体越多,看到的物体越小;
  • Clipping Planes:裁剪平面,视锥体中近平面和远平面的位置;
  • Viewport Rect:视口在屏幕中的位置和大小(相对值),以屏幕左下角为原点;
  • Depth:渲染图层深度,用于设置相机渲染图层的显示顺序;
  • Rendering Path:渲染路径,用于调整渲染性能(可以在 Stats 里查看性能)
  • Target Texture:将相机画面存储到一个纹理图片(RenderTexture)中。

补充:基于 Target Texture 属性,可以使用 RawImage 显示次相机渲染的 RenderTexture,实现带主题边框的小地图、八倍镜等效果。

2 应用

本节将通过实现小地图案例展示相机的应用。

1)游戏界面

2)游戏对象层级结构

3)Transform 组件参数

1. 相机 Transform 组件参数

Name Type Position Rotation Scale Viewport Rect
Main Camera Camera (0, 4, -5) (38, 0, 0) (1, 1, 1) (0, 0, 1, 1)
MinimapCamera Camera (0, 12, 0) (90, 0, 0) (1, 1, 1) (0.8, 0.7, 0.2, 0.3)

2. 玩家 Transform 组件参数

Name Type Position Rotation Scale Color/Texture
Player Empty (0, 0.25, -5) (0, 0, 0) (1, 1, 1) #228439FF
Botton Cube (0, 0, 0) (0, 0, 0) (2, 0.5, 2) #228439FF
Top Cube (0, 0.5, 0) (0, 0, 0) (1, 0.5, 1) #228439FF
Gun Cylinder (0, 0, 1.5) (90, 0, 0) (0.2, 1, 0.4) #228439FF
FirePoint Empty (0, 1.15, 0) (0, 0, 0) (1, 1, 1) ——

补充:Player 游戏对象添加了刚体组件。

3. 敌人 Transform 组件参数

Name Type Position Rotation Scale Color/Texture
Enemy1 Empty (7, 0.25, 1) (0, 120, 0) (1, 1, 1) #F83333FF
Enemy2 Enemy (-1, 0.25, 5) (0, 60, 0) (1, 1, 1) #EA9132FF
Enemy3 Enemy (-5, 0.25, -1) (0, -40, 0) (1, 1, 1) #5DC2F4FF

说明:Enemy1~Enemy3 都是由 Player copy 而来。

4. 地面和炮弹 Transform 组件参数

Name Type Position Rotation Scale Color/Texture
Plane Plane (0, 0, 0) (0, 0, 0) (10, 10, 10) GrassRockyAlbedo
Bullet Sphere (0, 0.5, -5) (0, 0, 0) (0.3, 0.3, 0.3) #228439FF

补充:炮弹作为预设体拖拽到 Assets/Resources/Prefabs 目录下,并且添加了刚体组件。

4)脚本组件

MainCameraController.cs

using UnityEngine;public class MainCameraController : MonoBehaviour {private Transform player; // 玩家private Vector3 relaPlayerPos; // 相机在玩家坐标系中的位置private float targetDistance = 15f; // 相机看向玩家前方的位置private void Start() {relaPlayerPos = new Vector3(0, 4, -8);player = GameObject.Find("Player/Top").transform;}private void LateUpdate() {CompCameraPos();}private void CompCameraPos() { // 计算相机坐标Vector3 target = player.position + player.forward * targetDistance;transform.position = transformVecter(relaPlayerPos, player.position, player.right, player.up, player.forward);transform.rotation = Quaternion.LookRotation(target - transform.position);}// 求以origin为原点, locX, locY, locZ 为坐标轴的本地坐标系中的向量 vec 在世界坐标系中对应的向量private Vector3 transformVecter(Vector3 vec, Vector3 origin, Vector3 locX,  Vector3 locY,  Vector3 locZ) {return vec.x * locX + vec.y * locY + vec.z * locZ + origin;}
}

说明: CameraController 脚本组件挂在 MainCamera 游戏对象上。

MinmapCameraController.cs

using UnityEngine;public class MinimapController : MonoBehaviour {private Transform player; // 玩家private float height = 12; // 相机离地面的高度private bool isFullscreen = false; // 小地图相机是否全屏private Rect minViewport; // 小地图视口位置和大小(相对值)private Rect FullViewport; // 全屏时视口位置和大小(相对值)private void Start() {player = GameObject.Find("Player/Top").transform;minViewport = GetComponent<Camera>().rect;FullViewport = new Rect(0, 0, 1, 1);}private void Update() {if (Input.GetMouseButtonDown(0) && IsClickMinimap()) {if (isFullscreen) {GetComponent<Camera>().rect = minViewport;} else {GetComponent<Camera>().rect = FullViewport;}isFullscreen = !isFullscreen;}}private void LateUpdate() {Vector3 pos = player.position;transform.position = new Vector3(pos.x, height, pos.z);}public bool IsClickMinimap() { // 是否单击到小地图区域Vector3 pos = Input.mousePosition;if (isFullscreen) {return true;}if (pos.x / Screen.width > minViewport.xMin && pos.y / Screen.height > minViewport.yMin) {return true;}return false;}
}

说明: MinimapController 脚本组件挂在 MinimapCamera 游戏对象上。

PlayerController.cs

using UnityEngine;public class PlayerController : MonoBehaviour {private MinimapController minimapController; // 小地图控制器private Transform firePoint; // 开火点private GameObject bulletPrefab; // 炮弹预设体private float tankMoveSpeed = 4f; // 坦克移动速度private float tankRotateSpeed = 2f; // 坦克转向速度private Vector3 predownMousePoint; // 鼠标按下时的位置private Vector3 currMousePoint; // 当前鼠标位置private float fireWaitTime = float.MaxValue; // 距离上次开火已等待的时间private float bulletCoolTime = 0.15f; // 炮弹冷却时间private void Start() {minimapController = GameObject.Find("MinimapCamera").GetComponent<MinimapController>();firePoint = transform.Find("Top/Gun/FirePoint");bulletPrefab = (GameObject) Resources.Load("Prefabs/Bullet");}private void Update() {Move();Rotate();Fire();}private void Move() { // 坦克移动float hor = Input.GetAxis("Horizontal");float ver = Input.GetAxis("Vertical");if (Mathf.Abs(hor) > float.Epsilon || Mathf.Abs(ver) > float.Epsilon) {Vector3 vec = transform.forward * ver + transform.right * hor;GetComponent<Rigidbody>().velocity = vec * tankMoveSpeed;Vector3 dire = new Vector3(hor, ver, 0);dire =  dire.normalized * Mathf.Min(dire.magnitude, 1);}}private void Rotate() { // 坦克旋转if (Input.GetMouseButtonDown(1)) {predownMousePoint = Input.mousePosition;} else if (Input.GetMouseButton(1)) {currMousePoint = Input.mousePosition;Vector3 vec = currMousePoint - predownMousePoint;GetComponent<Rigidbody>().angularVelocity = Vector3.up * tankRotateSpeed * vec.x;predownMousePoint = currMousePoint;}}private void Fire() { // 坦克开炮fireWaitTime += Time.deltaTime;if (Input.GetMouseButtonDown(0) && !minimapController.IsClickMinimap() || Input.GetKeyDown(KeyCode.Space)) {if (fireWaitTime > bulletCoolTime) {BulletInfo bulletInfo = new BulletInfo("PlayerBullet", Color.red, transform.forward, 10f, 15f);GameObject bullet = Instantiate(bulletPrefab, firePoint.position, Quaternion.identity);bullet.AddComponent<BulletController>().SetBulletInfo(bulletInfo);fireWaitTime = 0f;}}}
}

说明: PlayerController 脚本组件挂在 Player 游戏对象上。

BulletController.cs

using UnityEngine;
using UnityEngine.UI;public class BulletController : MonoBehaviour {private BulletInfo bulletInfo; // 炮弹信息private void Start () {gameObject.name = bulletInfo.name;GetComponent<MeshRenderer>().material.color = bulletInfo.color;float lifeTime = bulletInfo.fireRange / bulletInfo.speed; // 存活时间Destroy(gameObject, lifeTime);}private void Update () {transform.GetComponent<Rigidbody>().velocity = bulletInfo.flyDir * bulletInfo.speed;}public void SetBulletInfo(BulletInfo bulletInfo) {this.bulletInfo = bulletInfo;}
}

说明:BulletController 脚本组件挂在 Bullet 游戏对象上(代码里动态添加)。

BulletInfo.cs

using UnityEngine;public class BulletInfo {public string name; // 炮弹名public Color color; // 炮弹颜色public Vector3 flyDir; // 炮弹飞出方向public float speed; // 炮弹飞行速度public float fireRange; // 炮弹射程public BulletInfo(string name, Color color, Vector3 flyDir, float speed, float fireRange) {this.name = name;this.color = color;this.flyDir = flyDir;this.speed = speed;this.fireRange = fireRange;}
}

5)运行效果

【Unity3D】相机相关推荐

  1. Unity-3D相机跟随控制

    Unity-3D相机跟随控制 跟随算法 横向与纵向旋转摄像机 滚轮调节距离 全部代码 跟随算法 要实现3D摄像机的控制第一步就是先实现摄像机跟随物体移动. 要想让相机跟随物体移动,就要明白在一定角度下 ...

  2. Unity3D相机限制移动范围

    在Unity开发的过程中,我们所用的地图场景都会有大小,那么体验的过程中,就需要我们相机只能渲染地图内的场景,可能方法有很多,但是在这,我就用了Mathf.Clamp()函数,该函数需要初始三个数,M ...

  3. Unity3D相机操控(完整模拟Scene视图操作)

    文章目录 1. 需求 2. 效果 3. 逻辑梳理 3.1 正交/透视视图的缓动切换 3.2 拉近缩远 3.3 上下左右拖拽相机 4 源码 1. 需求   一直想把Scene视图相机的操作复制到Game ...

  4. Unity3D相机控制

    实现目标: 视野随着鼠标指针进行上下左右移动 鼠标滚轮控制视野缩放 实现思路: 将摄像机作为其它游戏对象的子物体,通过获取鼠标输入控制其父节点的旋转.移动来实现相机的视野移动和缩放. 层次结构如下: ...

  5. Unity3d 修改编辑界面控制图标大小 修改相机图标显示大小

    在 Unity3d 会显示一些控制图标,如相机图标和光照图标.而在编辑界面我发现这些图标太大了,影响我编辑,可以通过界面控制修改图标显示大小 在用户端玩游戏的小伙伴是看不到编辑端的控制图标的,但是在开 ...

  6. unity3d EasyTouch滑动屏幕移动相机观看场景

    unity3d相机拖拽移动脚本,结合easyTouch,不提供easyTouch插件,此脚本需easyTouch5支持,下载easyTouch后把脚本放到工程即可,然后按下面的图示例就可以了 相机组件 ...

  7. [Unity3D]Unity资料大全免费分享

    都是网上找的连七八糟的资料了,整理好分享的,有学习资料,视频,源码,插件--等等 东西比较多,不是所有的都是你需要的,可以按  ctrl+F 来搜索你要的东西,如果有广告,不用理会,关掉就可以了,如果 ...

  8. 相机录像出现花屏_[Unity3D]花屏问题解决

    "多年前遇到的花屏问题,通过不断的测试.重现.修改.反思,终于得出了最终原因和最终答案!" 你的屏幕花了? 去检查一下,你游戏中的相机clearFlag的设置,是不是没有clear ...

  9. 学习Unity3D之探照灯效果和相机跟随。

    欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌 ...

  10. Unity3d实现鼠标控制相机绕物体旋转(带阻尼)

    Unity3d实现鼠标控制相机绕物体旋转(带阻尼) 本来想的是用四元数实现球性插值实现阻尼效果,但是不知道四元数怎么绕定点旋转.因此用速度衰减的方法进行实现. 1.实现鼠标控制相机带阻尼旋转 2.实现 ...

最新文章

  1. C++拷贝构造函数(复制构造函数)详解
  2. 增量架构方法与系统构建
  3. oracle服务器错误,oracle 11g数据库维护中错误总结
  4. LiveVideoStack Meet | 苏州:视频会议研发中心一日游
  5. The Zen of Python
  6. 各类科技活动获奖公示网站
  7. 【MySQL】ERROR 1412 (HY000) Table definition has changed, please retry transaction
  8. 列表的下标;查找,判断,增加,删除函数
  9. 小白使用word小技巧-持续更新(以论文服务为主)
  10. 2017北京国庆刷题Day2 afternoon
  11. Ajax案例-基于XML,以POST方式,完成省份-城市二级下拉联动
  12. 一个简单的堆栈,逻辑很清晰
  13. 下面的android入门开发视频教程还不错
  14. phpstudy修改mysql账户名_phpstudy怎么更改用户名
  15. 计算机高级职称考试报考条件,高级工程师证怎么考 报考条件
  16. 怎么查看计算机mac地址,怎么查电脑的mac地址?电脑mac地址查询方法
  17. CoinCola可盈可乐研究院2月报 | 加密货币集体上涨
  18. 常见RGB 颜值表和半透明颜色值的写法
  19. 20230426作业
  20. 动态照片怎么制作?这三款软件推荐给你

热门文章

  1. mysql 引擎 外键_mysql的事物,外键,与常用引擎
  2. 《Python语言程序设计》王恺 王志 机械工业出版社 第二章 Python的基础语法 课后习题答案
  3. 出海营销指南:什么是Pinterest分析?
  4. 解决普通笔记本无法连接iPhone热点的问题
  5. 银行计算机专业面试,建设银行计算机专业面试问题汇总和精彩回答
  6. 看了让人吐血的146个脑筋急转弯问题
  7. POJ 3054 High Spies 笔记
  8. 实时分割网络(持续更新)
  9. 怎么制作画中画视频?学会这几招轻松实现
  10. 78系列79系列稳压芯片