游戏蛮牛2019-02-14 14:40:23
哈喽,大家好,好久没和大家见面了,继今日起以后又会在蛮牛相继发表一些个人针对Unity的经验与理解,希望能和大家相互探讨,共同进步哟~
OK,闲话就不多说啦,直接上干货才是正题。
今天要与大家分享的是《目标屏幕位置追踪显示》,或许大家不太好理解。
(ps:图片来源公司项目截图,so,大家懂的,稍微马克下)
功能条件就是:
1.有boss存在
2.boss在屏幕外
3.界面显示boss方向
根据boss的不同方位不同,标注会在屏幕边缘不同位置显示。
当时拿到这个功能脑中一个闪现就是 “小地图”,可是仔细研究下来才发现完全不是一回事好吧,小地图 直接使用 UGUI RawImage 渲染就设置就可以了,而且小地图的标注 如果boss位置很远,渲染的地图区域小的话 根本就看不到,
这就与要实现的功能相违背啦,所以小地图的方式果断被否决,so,只有自己尝试着实现啦,下面将提供我的一个思路。
首先,搭建一个场景,场景内容包括-角色/Boss/相机/方向舵/UI显示的标注,
具体怎么搭建我就不在此过多描述啦(相信这点基本功大家还是有的)
东西很少只是做测试使用 。
OK,东西准备好啦,那就直接动手操作吧~
让我们一起分析下,第一步显示方向,也就是说要找到boss相对角色存在的方位(前后左右)及偏移(角度)求方向,向量常规写法如下:
public class ffffffff : MonoBehaviour
{
public GameObject obj;
public RectTransform _img;
void Update()
{
var dir = (obj.transform.position - transform.position).normalized;
float direction = Vector3.Dot(dir, transform.forward);
Vector3 u= Vector3.Cross(dir, transform.forward);
if (direction > 1) { direction = 1f; }
if (direction < -1) { direction = -1f; }
direction = Mathf.Acos(direction) * Mathf.Rad2Deg;
Debug.Log("角度:" + direction + "---" + (u.y>0?"左边":"右边"));
_img.rotation =Quaternion.Euler(new Vector3(0, 0, direction * (u.y > 0 ? 1 : -1)));
}
让我们测试下效果,把脚本拖到场景角色上,然后,把boss拖给obj,运行。
大家可能已经发现现在我们的标志就会根据我们移动角色位置,同时指向boss角度位置(录制效果有点差,大家先将就看吧)
OK,既然通过以上脚本我们确定了角度方向,接下来就是让标注紧靠屏幕边缘移动吧。
这里实现了2种,运动轨迹,1.矩形;2.椭圆;
主要运用一些数学公式计算,这段代码太长了,还是点击原文查看吧~
以上代码属于该功能核心绑定代码,里面也有些额外的 如easyTouch移动操作等,代表绑定如下:
对了,相机的跟随代码并绑定, 如下:
using UnityEngine;
using System.Collections;
public class CameraFollowRole : MonoBehaviour
{
public Transform target;
public Vector3 offset;
public bool isStartFllow = false;
void Update()
{
if (isStartFllow)
{
if (!target)
return;
transform.position = target.position + offset;
}
}
}
OK,我们需要的东西搞定运行看结果
好啦 ,今天就这些吧,可能大家会说不是还有看见boss的时候标注隐藏 ,看不见才显示嘛~
额,这个自己可以加个距离判断或者使用OnBecameVisible()来判断是否在相机内,然后隐藏显示就行了哟~
点击原文链接下载测试工程项目包哦~
PS:我使用Unity5.2.2f版本开发测试的,低版本的同学打开可能会有场景丢失或easytouch不能使用,so,请按照上面的流程自行创建场景,和更新一个低版本的easytouch即可。
蛮牛社区(manew.com)分享最新的游戏研发和虚拟现实相关技术内容。