1 前言

​ 相机跟随是相机指始终跟随特定游戏对象,有以下 2 种跟随效果:

  • 位置跟随:相机指向目标游戏对象的向量始终不变
  • 位置和姿态跟随:相机在目标游戏对象的坐标系下的坐标和朝向始终不变

​ 实现相机位置和姿态跟随最简单的方法是:将相机游戏对象拖拽到目标游戏对象下,即相机作为目标游戏对象的子对象,其原理是:子对象的位置和姿态始终跟随父对象的变化而变化,并且保持相对不变。本文不展示这种方式,将通过代码控制相机位置变换,实现相机跟随效果。

2 应用

2.1 位置跟随

1)游戏对象

​ 游戏对象的 Transform 组件参数如下:

Name Type Position Rotation Scale Color/Texture
Plane Plane (0, 0, 0) (0, 0, 0) (10, 10, 10) GrassRockyAlbedo
Tank Empty (0, 0.25, -5) (0, 0, 0) (1, 1, 1) ——
Button 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

​ 游戏对象的层级结构如下:

2)脚本组件

​ Tank.cs

using UnityEngine;

public class Tank : MonoBehaviour {

	void Update () {
float hor = Input.GetAxis("Horizontal");
float ver = Input.GetAxis("Vertical");
transform.Translate(0, 0, ver * Time.deltaTime * 3);
transform.Rotate(Vector3.up * hor * Time.deltaTime * 120f);
}
}

​ 说明:Tank.cs 脚本组件挂在 Tank 游戏对象上。

​ CameraFollow.cs

using UnityEngine;

public class CameraFollow : MonoBehaviour {
private Transform player; // 玩家
private Vector3 dir; // 初始相机到目标坦克的方向向量 void Start() {
player = GameObject.Find("Tank").transform;
dir = player.position - transform.position;
} void LateUpdate() {
transform.position = player.position - dir;
}
}

​ 说明:CameraFollow.cs 脚本组件挂在 Main Camera 游戏对象上。

3)运行效果

2.2 位置和姿态跟随

​ 游戏对象即其 Transform 组件参数同 2.1 节,。

1)脚本组件

​ Tank.cs 脚本组件同 2.1 节。

​ CameraFollow.cs

using UnityEngine;

public class CameraFollow : MonoBehaviour {
private Transform player; // 玩家
private Vector3 dir; // 初始相机到目标坦克的方向向量 void Start() {
player = GameObject.Find("Tank").transform;
dir = player.position - transform.position;
} void LateUpdate() {
transform.position = transformVecter(-dir, player.position, player.right, player.up, player.forward);
transform.rotation = Quaternion.LookRotation(player.position - 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;
}
}

2)运行效果

​ 声明:本文转自【Unity3D】相机跟随

【Unity3D】相机跟随的更多相关文章

  1. Unity3D 相机跟随主角移动

    这里给主相机绑定一个脚本. 脚本写为: using UnityEngine; using System.Collections; public class camerafollow : MonoBeh ...

  2. Unity3D——相机跟随物体移动

    public Transform target; public float moveSmooth=5f; Vector3 offset; void Start () { offset = transf ...

  3. [原]unity3D 相机跟随

    using UnityEngine;using System.Collections; public class CameraFollow : MonoBehaviour {            p ...

  4. unity3d简单的相机跟随及视野旋转缩放

    1.实现相机跟随主角运动 一种简单的方法是把Camera直接拖到Player下面作为Player的子物体,另一种方法是取得Camera与Player的偏移向量,并据此设置Camera位置,便能实现简单 ...

  5. unity3D:游戏分解之角色移动和相机跟随

          游戏中,我们经常会有这样的操作,点击场景中某个位置,角色自动移动到那个位置,同时角色一直是朝向那个位置移动的,而且相机也会一直跟着角色移动.有些游戏,鼠标滑动屏幕,相机就会围绕角色旋转. ...

  6. unity相机跟随Player常用方式

    固定跟随,无效果(意义不大) public class FollowPlayer : MonoBehaviour { public Transform Player; private Vector3 ...

  7. SurvivalShooter学习笔记(一.相机跟随)

    1.场景碰撞已好,地板需建一Quad去掉渲染留下碰撞,设置layer为Floor:用于建立摄像机朝向地面的射线,确定鼠标停留点,确定主角需要的朝向. 2.设置摄像机跟随主角: 本例中摄像机设置为正交模 ...

  8. unity 常用的几种相机跟随

    固定相机跟随 这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.Collections; public c ...

  9. Unity中几种简单的相机跟随

    #unity中相机追随 固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.Collectio ...

  10. unity_实用小技巧(相机跟随两个主角移动)

    在两人对战的游戏中,有时候我们希望能看清楚两玩家的状态,这时我们需要让相机跟随玩家,可是我们不能让相机只跟随一个玩家移动,这时我们可以取两玩家的中点作为相机的位置.方法如下: public Trans ...

随机推荐

  1. 配置Maven项目的pom.xml时遇到input contained no data问题

    1.问题 2.解决 我发现每次当我修改一些部分之后,就会遇到这个问题 我遵循了他的建议重新排列标记属性,然后重新加载就解决了报错 个人怀疑是修改后并没有识别之类的? 最终原因:是我在Maven项目中的 ...

  2. 【MCU】浮点数如何判等

    [来源]https://mp.weixin.qq.com/s/481H4imm73IIS1yFI7-DNA

  3. RabbitMQ .net core 客户端 EasyNetQ 的使用

    依赖注入 var connectionConfiguration = new ConnectionConfiguration { Hosts = new List<HostConfigurati ...

  4. Go-用本地时间解析时间字符串

    Go-用本地时间解析时间字符串 1. 指定本地时区 const ( gLocalTimeZone = "Asia/Shanghai" ) 2. 加载本地时区 var ( gLoca ...

  5. [转帖]MySQL如何进行索引重建操作?

    MySQL如何进行索引重建操作? - 潇湘隐者 - 博客园 (cnblogs.com) 在MySQL数据库中,没有类似于SQL Server数据库或Oracle数据库中索引重建的语法(ALTER IN ...

  6. [转帖]Linux命令(64)——strings命令

    https://cloud.tencent.com/developer/article/1414999 1.命令简介 strings命令是二进制工具集GNU Binutils的一员,用于打印文件中可打 ...

  7. [转帖]echo 输出不换行-e \c

    http://www.my889.com/i/1952 在shell中,echo输出会自动换行.有时候在循环中不希望echo输出换行.代码实现如下: 1 echo -e " \c" ...

  8. js中forEach的用法、forEach如何跳出循环、forEach与for之间的区别

    定义和用法 forEach() 调用数组的每个元素,并将元素传递给回调函数. 注意: forEach() 对于空数组是不会执行回调函数的. 用法: array.forEach(function(cur ...

  9. vue全局事件总线和消息订阅详细讲解

    全局事件总线 在写组件的时候,我们都知道父传递子 也知道子传递给父 但是组件间嵌套复杂的时候我们应该怎么通信呢? 有的小伙伴会说适用vuex,的确是可以解决问题的 下面我们说一下全局事件总线 一种组件 ...

  10. 【解决一个小问题】macbook m2 上交叉编译 gozstd

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 已知 zstd 是一个优秀的压缩库,gozstd封装了这个 ...