首页 > 其他分享 >【Unity3D】相机跟随

【Unity3D】相机跟随

时间:2023-03-20 20:59:28浏览次数:59  
标签:Unity3D Tank Vector3 transform 相机 player position 跟随

1 前言

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

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

img

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

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

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

img

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)运行效果

img

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)运行效果

img

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

标签:Unity3D,Tank,Vector3,transform,相机,player,position,跟随
From: https://www.cnblogs.com/zhyan8/p/17234879.html

相关文章

  • 【Unity3D】UGUI之Text
    1Text简介​UGUI概述中介绍了Canvas渲染模式、RectTransform组件、锚点(Anchor)等,本文将介绍UGUI中的Text控件。​在Hierarchy窗口右键,选择UI列表里......
  • 【Unity3D】UGUI概述
    1UGUI与GUI区别​GUI控件在编译时不能可视化,并且界面不太美观,在实际应用中使用的较少。UGUI在编译时可视化,界面美观,实际应用较广泛。2Canvas渲染模式(Render......
  • 【Unity3D】UGUI之Button
    1Button属性面板​在Hierarchy窗口右键,选择UI列表里的Button控件,即可创建Button控件,选中创建的Button控件,按键盘【T】键,可以调整Button控件的大小和位置......
  • 【Unity3D】UGUI之Image和RawImage
    1纹理(Texture)​Image控件和RawImage控件都是承载渲染图片的控件,都需要指定一个纹理(Texture)图片。在Assets窗口选中一张图片,在Inspector窗口的参数设置面板可......
  • 【Unity3D】UGUI之Slider
    1Slider属性面板​在Hierarchy窗口右键,选择UI列表里的Slider控件,即可创建Slider控件,选中创建的Slider控件,按键盘【T】键,可以调整Slider控件的大小和位置......
  • 【Unity3D】UGUI之Toggle
    1Toggle属性面板​在Hierarchy窗口右键,选择UI列表里的Toggle控件,即可创建Toggle控件,选中创建的Toggle控件,按键盘【T】键,可以调整Toggle控件的大小和位置......
  • Unity3D 小案例技巧04------UI登录+场景切换
    编辑器使用Unity20211.创建UI---Canvas,修改名称为login设置Canvas的大小为1920*1080      2. 在login下创建UI----image  背景:bg给背景添加背......
  • Three.js自定义shader实现离相机越近越透明效果
    constcustomShader=newTHREE.ShaderMaterial({uniforms:{},defines:{nearDis:0.3},transparent:true,side:THREE.DoubleSide,vertexShader:......
  • 相机位姿p3p推导
    参考文章:推导过程主体推导过程辅助验证三个cos值具体求法介绍......
  • Unity3D 小案例技巧01------小地图
    使用编辑器:Unity2021 1.先添加场地----Plane组件 2.在场地下添加主物体 3.在主物体下添加摄像机拍摄小地图场景----Camera 4.在外部添加UI---RawImage画板承载小......