Unity 实现一个简单的 TPS 相机

效果如下:

代码如下:

1public class TPSCamera : MonoBehaviour 2{ 3 /// <summary> 4 /// 目标对象 5 /// </summary> 6 [SerializeField] 7 Transform target = null; 8 9 /// <summary> 10 /// 旋转参数 11 /// </summary> 12 [SerializeField] 13 Vector2 rotate; 14 15 /// <summary> 16 /// 旋转速度 17 /// </summary> 18 [SerializeField] 19 float rotateSpeed = 2; 20 21 /// <summary> 22 /// 视口大小 23 /// </summary> 24 [SerializeField] 25 float viewSize = 30; 26 27 /// <summary> 28 /// 默认角度 29 /// 在目标对象的哪个方向 30 /// </summary> 31 [SerializeField] 32 float defaultAngle = -135; 33 34 /// <summary> 35 /// 离目标对象的距离 36 /// </summary> 37 [SerializeField] 38 float radius = 3; 39 40 /// <summary> 41 /// 离目标对象的高度 42 /// </summary> 43 [SerializeField] 44 float height = 1.5f; 45 46 public bool Aim; 47 48 public bool visiable = false; 49 50 public CursorLockMode lockMode; 51 52 Camera cam; 53 54 /// <summary> 55 /// 绕任意轴旋转的参考点 56 /// 暂时用这个办法替代 57 /// </summary> 58 Transform tr; 59 60 static TPSCamera _inst; 61 62 public static TPSCamera inst 63 { 64 get { 65 return _inst; 66 } 67 } 68 69 void Awake () 70 { 71 _inst = this; 72 } 73 74 void Start () 75 { 76 cam = this.GetComponent<Camera> (); 77 tr = new GameObject ().transform; 78 } 79 80 void FixedUpdate () 81 { 82 rotate.x += Input.GetAxis ("Mouse X") * rotateSpeed; 83 rotate.y += Input.GetAxis ("Mouse Y") * rotateSpeed; 84 viewSize -= Input.mouseScrollDelta.y * 3; 85 86 //一些约束,不用管 87 if (viewSize < 30) 88 { 89 viewSize = 30; 90 } else if (viewSize > 60) 91 { 92 viewSize = 60; 93 } 94 95 if (rotate.y < -60) 96 { 97 rotate.y = -60; 98 } else if (rotate.y > 45) 99 { 100 rotate.y = 45; 101 } 102 103 cam.fieldOfView = viewSize; 104 Cursor.visible = visiable; 105 Cursor.lockState = lockMode; 106 } 107 108 void LateUpdate () 109 { 110 Transform self = this.transform; 111 Vector3 targetPos = target.position; 112 targetPos.y += height; 113 114 //旋转y轴,左右滑动 115 Vector2 v1 = IMath.CalcAbsolutePoint (rotate.x, radius); 116 self.position = targetPos + new Vector3 (v1.x, 0, v1.y); 117 118 //相机的观察点 119 Vector2 v2 = IMath.CalcAbsolutePoint (rotate.x + defaultAngle, radius); 120 Vector3 viewPoint = new Vector3 (v2.x, 0, v2.y) + targetPos; 121 122 //计算2点之间的距离 123 float dist = Vector3.Distance (self.position, viewPoint); 124 125 //取中点作为旋转轴 126 Vector3 center = Vector3.MoveTowards (self.position, viewPoint, dist / 2); 127 128 //这里我不知道怎么计算这个任意轴,暂时先用这个方法替代 129 tr.position = center; 130 tr.LookAt (targetPos); 131 tr.eulerAngles += new Vector3 (0, 0, rotate.y); 132 133 //旋转x轴,上下滑动 134 Vector3 temp = tr.right * dist / 2; 135 self.position = tr.position - temp; 136 self.LookAt (tr.position + temp); 137 138 } 139 140} 141 142public static Vector2 CalcAbsolutePoint (float angle, float dist) 143{ 144 angle += 90; 145 dist = -dist; 146 float x = dist * Mathf.Cos (-angle * Mathf.PI / 180); 147 float y = dist * Mathf.Sin (-angle * Mathf.PI / 180); 148 return new Vector2 (x, y); 149}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用