当前位置:   article > 正文

[Unity]实现血条在角色头顶并随时看向摄像机_unity 头顶 血条

unity 头顶 血条

方法一:使用Vector3.ProjectOnPlane 

方法原型:Vector3.ProjectOnPlane(Vector3 投影向量,Vector3 投影平面法向量);

返回:Vector3 平面上的投影向量

Vector3.ProjectOnPlane是Vector3提供的一个静态方法,用于计算某个向量在某个平面上的投影向量

那么我们先创建一个需要投影的向量

gameObject.transform.position - Camera.main.transform.position;/*(从摄像机位置指向血条位置)*/

摄像机视野平面法向量

Camera.main.transform.forward;

完成投影:

Vector3 lookPoint = Vector3.ProjectOnPlane(gameObject.transform.position - Camera.main.transform.position, Camera.main.transform.forward);

那么返回结果应是摄像机视野平面上,摄像机位置 指向 血条位置在摄像机视野平面上的投影点的位置(我们想要的结果位置) 的一个向量

那么我们想要的结果位置就应该是:

lookPoint+Camera.main.transform.position

让血条物体动态的看向结果位置

gameObject.transform.LookAt(lookPoint+Camera.main.transform.position);

  1. //使用 Vector3.ProjectOnPlane (投影向量,投影平面法向量)用于计算某个向量在某个平面上的投影向量
  2. Vector3 lookPoint = Vector3.ProjectOnPlane(this._ArticleBlood.transform.position-Camera.main.transform.position,Camera.main.transform.forward);
  3. this._ArticleBlood.LookAt(Camera.main.transform.position +lookPoint);
_ArticleBlood   是血条

方法二:使用单独的UI摄像机渲染UI层

UICamera 设置 使用参考

Unity使用UICamera的分享和经验总结 - 知乎

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. using UnityEngine;
  5. public class ArticleBlood : MonoBehaviour
  6. {
  7. [SerializeField]
  8. private Transform _ArticleBlood;//血条
  9. [SerializeField]
  10. private Camera _UICamera;//UI摄像机
  11. [SerializeField]
  12. private Camera _MainCamera;//主相机
  13. [SerializeField]
  14. private Transform _targetPos;//头顶位置
  15. void Update()
  16. {
  17. //使用 Vector3.ProjectOnPlane (投影向量,投影平面法向量)用于计算某个向量在某个平面上的投影向量
  18. // Vector3 lookPoint = Vector3.ProjectOnPlane(this._ArticleBlood.transform.position-Camera.main.transform.position,Camera.main.transform.forward);
  19. // this._ArticleBlood.LookAt(Camera.main.transform.position +lookPoint);
  20. //使用UI摄像机单独渲染UI
  21. // 第二行: m_Target.position为角色头顶的位置,即将血条要显示的位置转换成相机中的观看的位置,第三个方向z用于表示目标点与相机之间的距离
  22. // 第三行:因为血条是属于UI层级,主摄像机无法观察到,所以需要将视口坐标转化成UI摄像机能看到的世界坐标。
  23. if(this._MainCamera==null||this._UICamera==null||this._targetPos==null)return;
  24. Vector3 pos = this._MainCamera.WorldToViewportPoint(this._targetPos.transform.position);
  25. Vector3 uipos = this._UICamera.ViewportToWorldPoint(pos);
  26. this._ArticleBlood.transform.position = uipos;
  27. }
  28. }

效果:

第三种方法:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class LookAtTheCamera : MonoBehaviour
  5. {
  6. [SerializeField] private GameObject _gameObject;
  7. private Camera _camera;
  8. void Start()
  9. {
  10. _camera=Camera.main;
  11. }
  12. void Update()
  13. {
  14. _gameObject.transform.rotation = Quaternion.LookRotation(_camera.transform.forward);
  15. }
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/108799?site
推荐阅读
相关标签
  

闽ICP备14008679号