using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace ShotSimulator.Target { public enum ReduceHealthTriggerType { None, //不扣除 OnHovering, //悬停中 OnClick, //点击 } public enum ReduceHealthType { Per, Time } public enum MotionType { None, Foreach, PingPong } public class SphereShotTarget : BaseShotTarget { #region Health private ReduceHealthTriggerType m_ReduceHealthTriggerType; private ReduceHealthType m_ReduceHealthType; private float maxHealth; private float curHealth; public float CurHealth { get { return curHealth; } set { curHealth = value; if (CurHealth > 1) { healthBarImage.color = new Color(0, 1, 1); } else { healthBarImage.color = Color.red; } healthBar.value = curHealth / maxHealth; } } [SerializeField] private Slider healthBar; public Image healthBarImage; private bool viewHealthBar; public bool ViewHealthBar { get { return viewHealthBar; } set { viewHealthBar = value; healthBar.gameObject.SetActive(viewHealthBar); } } #endregion #region Color [SerializeField] private MeshRenderer meshRenderer; [SerializeField] public Color defaultColor; [SerializeField] public Color onClickColor; [SerializeField] public Color onHoveringColor; public bool onClickCanChangeColor; public bool onHoveringCanChangeColor; #endregion #region Method public void Init(float maxHealth, ReduceHealthTriggerType rgtType, bool viewHealthBar, ReduceHealthType reduceHealthType, MotionType mType, Vector3 origin, List pos = null, float speed = 5) { this.maxHealth = maxHealth; CurHealth = this.maxHealth; m_ReduceHealthType = reduceHealthType; m_ReduceHealthTriggerType = rgtType; this.ViewHealthBar = viewHealthBar; m_MotionType = mType; gameObject.transform.position = origin; targetPositions.Clear(); if (pos != null) { targetPositions.AddRange(pos); } //meshRenderer.material.SetColor("Color", defaultColor); meshRenderer.material.color = defaultColor; this.speed = speed; } private void TriggerReduceHealth(ReduceHealthTriggerType type) { if (type != ReduceHealthTriggerType.None && m_ReduceHealthTriggerType == type) { switch (m_ReduceHealthType) { case ReduceHealthType.Per: CurHealth--; break; case ReduceHealthType.Time: CurHealth -= Time.deltaTime; break; } } } #endregion #region Motion private MotionType m_MotionType; private List targetPositions = new List(); public int curTargetPosIndex; private float speed; #endregion #region Interactive public override void OnClick() { if (!IsRunning) return; base.OnClick(); if (onClickCanChangeColor) { meshRenderer.material.color = onClickColor; } //SoundManager.GetInstance().PlaySoundEffect("Audio/音效/aimlab击中音效3", false); TriggerReduceHealth(ReduceHealthTriggerType.OnClick); } public override void OnEnter() { if (!IsRunning) return; base.OnEnter(); if (onHoveringCanChangeColor) { meshRenderer.material.color = onHoveringColor; } } public override void OnExit() { if (!IsRunning) return; base.OnExit(); if (onHoveringCanChangeColor) { meshRenderer.material.color = defaultColor; } } public override void OnHovering() { if (!IsRunning) return; base.OnHovering(); TriggerReduceHealth(ReduceHealthTriggerType.OnHovering); } #endregion #region Unity public override void FixedUpdate() { if (!IsRunning || m_MotionType == MotionType.None) return; base.FixedUpdate(); PingPongUpdate(); } private void PingPongUpdate() { float dis = Vector3.Distance(transform.position, targetPositions[curTargetPosIndex]); if (dis <= 0.01) { curTargetPosIndex++; if (curTargetPosIndex >= targetPositions.Count) { curTargetPosIndex = 0; targetPositions.Reverse(); } } //transform.position = Vector3.Lerp(transform.position, targetPositions[curTargetPosIndex], speed * Time.deltaTime); transform.position = Vector3.MoveTowards(transform.position, targetPositions[curTargetPosIndex], speed * Time.fixedDeltaTime); } #endregion private void OnDestroy() { if (curHealth <= 0) { GameObject brokenObj = Instantiate(Resources.Load("Prefabs/Broken"), transform.position, transform.rotation); brokenObj.transform.localScale = meshRenderer.transform.localScale; brokenObj.GetComponent().material.color = defaultColor; Destroy(brokenObj, 7); } } } }