127 lines
3.9 KiB
C#
127 lines
3.9 KiB
C#
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;
|
||
}
|
||
}
|
||
} |