| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- 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<Vector3> 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<Vector3> targetPositions = new List<Vector3>();
- 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<GameObject>("Prefabs/Broken"), transform.position, transform.rotation);
- brokenObj.transform.localScale = meshRenderer.transform.localScale;
- brokenObj.GetComponent<SkinnedMeshRenderer>().material.color = defaultColor;
- Destroy(brokenObj, 7);
- }
- }
- }
- }
|