Wizard_Of_Wak/Assets/1_Script/Player/PlayerSkill.cs

127 lines
3.9 KiB
C#
Raw Blame History

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class PlayerSkill : MonoBehaviour
{
private Animator animator;
private PlayerController playerController;
public Dictionary<SkillKeyType, SkillData> skillList = new Dictionary<SkillKeyType, SkillData>();
public enum SkillKeyType { M_Right, Q, E, R, T }
void Start()
{
playerController = GetComponent<PlayerController>();
animator = GetComponentInChildren<Animator>();
PlayManager.Instance.rightMouve += Skill_Right;
PlayManager.Instance.keySdown += Skill_Q;
}
private void Skill_Right()
{
BaseSkill(SkillKeyType.M_Right);
}
private void Skill_Q()
{
BaseSkill(SkillKeyType.Q);
}
public void BaseSkill(SkillKeyType skillKeyType)
{
if (!skillList.ContainsKey(skillKeyType)) return;
SkillData skillData = skillList[skillKeyType];
if (skillData != null && skillData.currentCoolTime == 0)
{
playerController.playerState = PlayerController.PlayerState.Skill;
SkillRot();
skillData.skillBase.Active(this);
StartCoroutine(SkillCoolTime(skillData, skillData.skillBase.skillCoolTime));
StartCoroutine(SkillStop(skillData.skillBase.skillStopTime));
Debug.Log(123);
}
}
IEnumerator SkillStop(float time)
{
yield return new WaitForSeconds(time);
Debug.Log(123);
animator.SetInteger("SkillIdx", -1);
playerController.playerState = PlayerController.PlayerState.Idle;
}
IEnumerator SkillCoolTime(SkillData skillData,float time)
{
skillData.currentCoolTime = time;
yield return new WaitForSeconds(time);
skillData.currentCoolTime = 0;
}
public void SkillAdd(SkillBase skill, SkillKeyType skillKeyType)
{
if (!skillList.ContainsKey(skillKeyType))
{
skillList[skillKeyType] = new SkillData(skill);
}
else
{
skillList[skillKeyType].skillBase = skill;
}
}
public void Skill_Anim(int idx)
{
animator.SetInteger("SkillIdx", idx);
}
public void SkillRot()
{
Vector3 playerScreenPos = Camera.main.WorldToScreenPoint(transform.position);
Vector3 mouseScreenPos = Input.mousePosition;
bool isLeft = mouseScreenPos.x < playerScreenPos.x;
if (Mathf.Abs(mouseScreenPos.x - playerScreenPos.x) > Mathf.Abs(mouseScreenPos.y - playerScreenPos.y))
{
transform.GetChild(0).localEulerAngles = isLeft ? new Vector3(0, 180, 0) : new Vector3(0, 0, 0);
animator.SetFloat("AttackState", 1);
playerController.idleState = 1f;
}
else
{
if (mouseScreenPos.y > playerScreenPos.y)
{
animator.SetFloat("AttackState", 0.5f);
playerController.idleState = 2f / 3f;
}
else
{
animator.SetFloat("AttackState", 0);
playerController.idleState = 1f / 3f;
}
}
}
public Vector3 GetSkillDirection()
{
Vector3 playerScreenPos = Camera.main.WorldToScreenPoint(transform.position);
Vector3 mouseScreenPos = Input.mousePosition;
Vector3 direction = (mouseScreenPos - playerScreenPos).normalized;
direction.z = 0; // 2D <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> z<><7A> 0<><30><EFBFBD><EFBFBD>
return direction;
}
private SkillData FindSkillData(SkillBase skillBase)
{
foreach (var pair in skillList)
{
if (pair.Value.skillBase == skillBase)
return pair.Value;
}
return null;
}
public class SkillData
{
public SkillBase skillBase;
public float currentCoolTime;
public SkillData(SkillBase baseSkill)
{
skillBase = baseSkill;
currentCoolTime = 0;
}
}
}