您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
99 行
3.1 KiB
99 行
3.1 KiB
using Unity.Sample.Core;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class HUDCrosshair : MonoBehaviour
|
|
{
|
|
#pragma warning disable 649
|
|
[ConfigVar(Name = "debug.hudmarker", DefaultValue = "0", Description = "Debug show hud markers")]
|
|
static ConfigVar debugHudMarker;
|
|
#pragma warning restore 649
|
|
|
|
public float hitIndicatorShowDuration = 0.5f;
|
|
public float deathIndicatorShowDuration = 1.0f;
|
|
public float damageDirectionShowDuration = 1.0f;
|
|
public RawImage hitMaker;
|
|
public RawImage deathMarker;
|
|
public RawImage damageIndicator;
|
|
|
|
void Awake()
|
|
{
|
|
hitMaker.gameObject.SetActive(false);
|
|
deathMarker.gameObject.SetActive(false);
|
|
damageIndicator.gameObject.SetActive(false);
|
|
}
|
|
|
|
public void FrameUpdate(PlayerCameraControl.State cameraSettings)
|
|
{
|
|
if (debugHudMarker.IntValue > 0)
|
|
{
|
|
if (debugHudMarker.IntValue == 1)
|
|
{
|
|
hitMaker.gameObject.SetActive(true);
|
|
m_hideHitIndicatorTime = Time.time + 5.0f;
|
|
}
|
|
else if (debugHudMarker.IntValue == 2)
|
|
{
|
|
deathMarker.gameObject.SetActive(true);
|
|
m_hideDeathIndicatorTime = Time.time + 5.0f;
|
|
}
|
|
debugHudMarker.Value = "0";
|
|
}
|
|
|
|
if (hitMaker.gameObject.activeSelf)
|
|
{
|
|
if (Time.time > m_hideHitIndicatorTime)
|
|
hitMaker.gameObject.SetActive(false);
|
|
}
|
|
if (deathMarker.gameObject.activeSelf)
|
|
{
|
|
if (Time.time > m_hideDeathIndicatorTime)
|
|
deathMarker.gameObject.SetActive(false);
|
|
}
|
|
if (damageIndicator.gameObject.activeSelf)
|
|
{
|
|
UpdateHitDirectionIndicator(cameraSettings.rotation);
|
|
if (Time.time > m_hideHitDirectionTime)
|
|
damageIndicator.gameObject.SetActive(false);
|
|
}
|
|
}
|
|
|
|
public void ShowHitMarker(bool lethal)
|
|
{
|
|
hitMaker.gameObject.SetActive(true);
|
|
m_hideHitIndicatorTime = Time.time + hitIndicatorShowDuration;
|
|
|
|
if (lethal)
|
|
{
|
|
m_hideDeathIndicatorTime = Time.time + deathIndicatorShowDuration;
|
|
deathMarker.gameObject.SetActive(true);
|
|
}
|
|
}
|
|
|
|
public void UpdateHitDirectionIndicator(Quaternion cameraRotation)
|
|
{
|
|
var cameraForward = cameraRotation * Vector3.forward;
|
|
var camDirPlane = Vector3.ProjectOnPlane(cameraForward, Vector3.up);
|
|
var camAngle = Vector3.Angle(Vector3.forward, camDirPlane);
|
|
var cross2 = Vector3.Cross(Vector3.forward, camDirPlane);
|
|
if (cross2.y < 0)
|
|
camAngle = -camAngle;
|
|
|
|
var angle = MathHelper.SignedAngle(camAngle, m_damageAngle);
|
|
|
|
var rot = Quaternion.Euler(0, 0, 180 - angle);
|
|
damageIndicator.transform.rotation = rot;
|
|
}
|
|
|
|
public void ShowHitDirectionIndicator(float damageAngle)
|
|
{
|
|
m_damageAngle = damageAngle;
|
|
damageIndicator.gameObject.SetActive(true);
|
|
m_hideHitDirectionTime = Time.time + damageDirectionShowDuration;
|
|
}
|
|
|
|
float m_damageAngle;
|
|
float m_hideHitIndicatorTime;
|
|
float m_hideDeathIndicatorTime;
|
|
float m_hideHitDirectionTime;
|
|
}
|