赞
踩
方法一:使用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);
- //使用 Vector3.ProjectOnPlane (投影向量,投影平面法向量)用于计算某个向量在某个平面上的投影向量
- Vector3 lookPoint = Vector3.ProjectOnPlane(this._ArticleBlood.transform.position-Camera.main.transform.position,Camera.main.transform.forward);
- this._ArticleBlood.LookAt(Camera.main.transform.position +lookPoint);
_ArticleBlood 是血条
方法二:使用单独的UI摄像机渲染UI层
UICamera 设置 使用参考
- using System.Collections;
- using System.Collections.Generic;
- using System.Runtime.InteropServices;
- using UnityEngine;
-
- public class ArticleBlood : MonoBehaviour
- {
- [SerializeField]
- private Transform _ArticleBlood;//血条
-
- [SerializeField]
- private Camera _UICamera;//UI摄像机
- [SerializeField]
- private Camera _MainCamera;//主相机
- [SerializeField]
- private Transform _targetPos;//头顶位置
- void Update()
- {
-
- //使用 Vector3.ProjectOnPlane (投影向量,投影平面法向量)用于计算某个向量在某个平面上的投影向量
- // Vector3 lookPoint = Vector3.ProjectOnPlane(this._ArticleBlood.transform.position-Camera.main.transform.position,Camera.main.transform.forward);
- // this._ArticleBlood.LookAt(Camera.main.transform.position +lookPoint);
-
- //使用UI摄像机单独渲染UI
- // 第二行: m_Target.position为角色头顶的位置,即将血条要显示的位置转换成相机中的观看的位置,第三个方向z用于表示目标点与相机之间的距离
- // 第三行:因为血条是属于UI层级,主摄像机无法观察到,所以需要将视口坐标转化成UI摄像机能看到的世界坐标。
- if(this._MainCamera==null||this._UICamera==null||this._targetPos==null)return;
- Vector3 pos = this._MainCamera.WorldToViewportPoint(this._targetPos.transform.position);
- Vector3 uipos = this._UICamera.ViewportToWorldPoint(pos);
- this._ArticleBlood.transform.position = uipos;
- }
- }
效果:
第三种方法:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class LookAtTheCamera : MonoBehaviour
- {
- [SerializeField] private GameObject _gameObject;
- private Camera _camera;
- void Start()
- {
- _camera=Camera.main;
- }
- void Update()
- {
- _gameObject.transform.rotation = Quaternion.LookRotation(_camera.transform.forward);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。