思路:只考虑xz平面,摄像机前向与敌人的方向夹角即目标为屏幕y轴夹角α,然后通过屏幕宽高计算边缘坐标。

代码如下:

public class Arrow : MonoBehaviour
{public Transform target;public Image ui;public Transform player;void Start(){player = transform;}void Update(){//获取目标的向量var tForward = target.position - player.position;tForward.y = 0;//获取玩家前向向量 即为屏幕的y轴var pForward = Quaternion.AngleAxis(player.eulerAngles.y, Vector3.up) * Vector3.forward;//获取玩家前向向量到目标向量夹角var rotAngle = Vector3.SignedAngle(pForward, tForward, Vector3.up);var tRot = Quaternion.AngleAxis(rotAngle, Vector3.up) * Vector3.forward;tRot.Set(tRot.x, tRot.z, 0);//ugui是在uicamera前面 图片的旋转 ui.transform.localEulerAngles = new Vector3(0, 0, -rotAngle);//位置方案1 绕着屏幕中点转圈//ui.transform.localPosition = tRot.normalized * 50;//位置方案2 在屏幕边缘显示float halfWidth = Screen.width / 2 - (ui.transform as RectTransform).rect.width / 2;float halfHeight = Screen.height / 2 - (ui.transform as RectTransform).rect.width / 2;//屏幕中点到中上和右上的夹角var screenRightTopRad = Mathf.Atan(halfWidth / halfHeight);//转成0-PI的弧度var rotRad = Mathf.Deg2Rad * Mathf.Abs(rotAngle);//区分屏幕上面和下面bool isTop = rotRad < Mathf.PI / 2;//下半使用-y轴计算rotRad = isTop ? rotRad : Mathf.PI - rotRad;float x = 0, y = 0;//弧度比屏幕右上的夹角小,需要计算x坐标  否则计算y坐标if (rotRad < screenRightTopRad){x = halfHeight * Mathf.Tan(rotRad) * Math.Sign(rotAngle);y = halfHeight;}else{x = halfWidth * Math.Sign(rotAngle);y = halfWidth * Mathf.Tan(Mathf.PI / 2 - rotRad);}y = isTop ? y : -y;ui.transform.localPosition = new Vector2(x, y);}
}

效果图如下,圆球为角色,方块为敌人,摄像机跟随在角色身后

摄像机没有旋转:

摄像机旋转:

获取敌人在屏幕的方向并显示箭头相关推荐

  1. Flutter中获取监听屏幕方向、锁定屏幕方向

    文章目录 获取当前屏幕的方向 实时监听屏幕方向的改变 锁定屏幕方向 锁定方向,禁止App随着设备的方向改变 锁定启动图的方向 默认效果 Android配置 IOS配置 动态改变Flutter的屏幕方向 ...

  2. 在Android的 设置-显示 中增加控制屏幕旋转方向的选项

    在Android的 设置->显示 中增加控制屏幕旋转方向的选项 参考博文 实现目标 效果局限 代码实现 配置资源文件 界面搭建 功能实现 默认值修改 其他情况 结语 参考博文 Android-x ...

  3. andorid popwindow全屏显示时获取到的屏幕高度偏小

    有这样一个需求,使用popwindow来显示全屏,做一个屏保的功能. 之前使用下面代码来获取,但是发现真正给到popwindow去显示的时候,高度略低,非常丑陋. //获取屏幕宽度和高度Display ...

  4. 京东方网络推广外包将为三星提供OLED 屏幕可造成韩国显示产业动荡

    近期,有消息称中国最大的显示器制造商京东方正准备为三星电子旗下智能手机业务提供OLED 屏幕,其将成为韩国显示器产商主要产品之一的"柔性OLED".此前,iPhone12系列产品推 ...

  5. 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像格式与 Camera图像传感器方向问题 二. NV21 图像格式视频旋转 1. 图像旋转问题及解决方案 ( 顺时针旋转 90 度 ) 2. NV ...

  6. 【Android 开发教程】检测屏幕的方向

    本章节翻译自<Beginning-Android-4-Application-Development>,如有翻译不当的地方,敬请指出. 原书购买地址http://www.amazon.co ...

  7. android自适应屏幕方向,Android 屏幕自适应方向尺寸与分辨率-Fun言

    摘要:  Android 屏幕自适应方向尺寸与分辨率,android 自适应分辨率,android 屏幕自适应,android 图片自适应,android 横屏布局,包括屏幕界面布局.多分辨率支持.获 ...

  8. STM32 BMP280模块 获取气压温度高度传感器数据 TFT显示

    STM32 BMP280模块 获取气压温度高度传感器数据 TFT显示 简介 BMP280是博世最新推出的数字气压传感器,具有卓越的性能和低廉的价格,相对精度为±0.12 hPa(相当于±1米),传感器 ...

  9. python点击屏幕坐标_通过Python,如何获取鼠标在屏幕上的X、Y轴坐标点

    最近在开发基于模拟器的微信自动添加好友工具时,需要获取模拟器中相应按钮,在当前屏幕中的X.Y轴坐标点.先前都是通过"Ctrl+Alt+A"截屏的方式 获取.如下图红框部分所示: 由 ...

最新文章

  1. mysql主从配置 windows_windows实现mysql主从配置
  2. Chapter1 CLR的执行模式
  3. mfc如何将一个数组中的字节数据用串口发送出去_[翻译] 串口通信的帧(frame)...
  4. QTP、LoadRunner、QC工具下载地址
  5. UNIX操作-命令快捷键
  6. 亚马逊如何变成 SOA(面向服务的架构)?
  7. E104-BT02蓝牙无线传输模块物联网芯片的智能控制、采集
  8. mysq命令行导出sql_mysql 命令行导入导出 sql
  9. 一个物理CPU如何划分成多个虚拟CPU
  10. WPF学习之路(十一)布局
  11. js获取页面宽度给JS div设宽度
  12. STM32开发笔记之——CMSIS DAP
  13. 数据库插中文变问号,Mybatis存储数据乱码,linux服务器上MySQL数据库乱码
  14. 【控制】《最优控制理论与系统》-胡寿松老师-第4章-动态规划
  15. 甲骨文裁员犯的病,任正非早在10年前就开出了药方
  16. ubantu pyCharm python 安装
  17. Photoshop2019 系统错误 无法启动此程序修复教程
  18. 当封号成为一种常态,网络营销人该何去何从?
  19. python zip 函数
  20. Html5播放器如何实现倍速播放

热门文章

  1. 2022上半年信息系统项目管理师综合知识真题(21-40)
  2. 用关键词获取商品SKUapi返回值说明
  3. poj 1069 Intersecting Lines
  4. python自然语言处理安装NLRK(自然语言工具包)
  5. 选择最佳的WordPress活动日历插件
  6. 搜狐这个Firefox合法吗?
  7. 怎么提升计算机专业英语水平,英语口语如何才能提升
  8. 数字孪生下的智慧园区信息化建设解决方案
  9. 让机器人学习捕猎?歪果仁脑洞太大
  10. 自媒体该怎么赚钱?新手运营自媒体方法