Unity/Unity FPS게임 프로젝트(오버워치라이크)

[Untiy 게임프로젝트] FPS 게임<오버워치>(5) - 캐릭터 스킬 기능

ForMan_ 2024. 5. 23. 14:46

캐릭터(솔져) 스킬 만들기

솔져의 스킬 기능을 구현해봤습니다.

 

좌shift - 달리기(이속up)

E스킬 - 생체장(자힐)

마우스 우클릭 - 나선로켓

 

1) 달리기는 캐릭터의 이동속도를 높여주고, 달리기 애니메이션을 플레이해줍니다.

2) 생체장스킬은 생체장과 비슷한 오브젝트를 만들어서 캐릭터 포지션에 설치한 후 캐릭터의 부족한 체력을 채워줍니다.

3) 나선로켓은 일정속도와 일정회전력을 가지면서 나아가고, 오브젝트와 닿았을 때 사라지며 이펙트를 플레이합니다. 직격뎀과 거리별 스플래쉬데미지를 아직 구현하지 않아서 나선로켓은 미완성입니다.        

 

[SkillManager.cs]

public class SkillManager : MonoBehaviour
{
    UnitController unitController;
    public GameObject prfSoldierESkill;
    public GameObject prfSoldierRocket;
    public Transform trmESkillSpawn;
    public Transform trmMouse1SkillSpawn;

    [Header("Speed")]
    [SerializeField]
    private float sprintSpeed = 1.75f;

    [Header("CoolTime")]
    [SerializeField]
    private float coolTimeE = 18f;
    [SerializeField]
    private float coolTimeMouse1 = 6f;

    [Header("Bool")]
    [SerializeField]
    private bool isActiveESkill;
    [SerializeField]
    private bool isActiveMouse1Skill;

    void Start()
    {
        unitController = GetComponent<UnitController>();
        isActiveESkill = false;
        isActiveMouse1Skill = false;
    }

    void Update()
    {
        if(isActiveESkill == true)
        {
            coolTimeE -= Time.deltaTime;

            if (coolTimeE <= 0)
            {
                coolTimeE = 18f;
                isActiveESkill = false;
            }
        }

        if(isActiveMouse1Skill == true)
        {
            coolTimeMouse1 -= Time.deltaTime;

            if(coolTimeMouse1 <= 0)
            {
                coolTimeMouse1 = 6f;
                isActiveMouse1Skill = false;
            }
        }
    }

    //솔져 우클릭 스킬.
    public void CreateRocket()
    {
        if (isActiveMouse1Skill == true)
            return;

        // 로켓 투사체 발사.
        GameObject objRocket = Instantiate(prfSoldierRocket);
        objRocket.transform.position = trmMouse1SkillSpawn.transform.position;
        objRocket.transform.rotation = trmMouse1SkillSpawn.transform.rotation;

        isActiveMouse1Skill = true;
    }

    // 솔져 E스킬.
    public void CreateHealArea()
    {
        if (isActiveESkill == true)
            return;

        GameObject objESkill = Instantiate(prfSoldierESkill);
        objESkill.transform.position = trmESkillSpawn.transform.position;

        isActiveESkill = true;

        Destroy(objESkill, 5.0f);
    }

    // 솔져 좌shift스킬.
    public void Sprint(bool isActive)
    {
        if(isActive == true)
        {
            unitController.currSpeed = unitController.walkSpeed * sprintSpeed;
        }
        else
        {
            unitController.currSpeed = unitController.walkSpeed;
        }
    }
}

 

[UntiController.cs]

public class UnitController : MonoBehaviour
{
	SkillManager skill;
    
    void Start()
    {
    	skill = GetComponent<SkillManager>();
    }
    
    void Update()
    {
        Skill_LeftShift();   // 좌Shift스킬.
        Skill_E();           // E스킬.
        Skill_MouseRight();  // 마우스 우클릭 스킬.
    }
    
    void Skill_MouseRight()
    {
        if (Input.GetMouseButtonDown(1))
        {
            skill.CreateRocket();
        }
    }
    void Skill_LeftShift()
    {
        if (Input.GetKey(KeyCode.LeftShift))
        {
            skill.Sprint(true);
            unitAnimController.IsRun(true);
        }
        else if (Input.GetKeyUp(KeyCode.LeftShift))
        {
            skill.Sprint(false);
            unitAnimController.IsRun(false);
        }
    }
    void Skill_E()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            skill.CreateHealArea();
        }
    }
}

 

[ESkill.cs]

public class ESkill : MonoBehaviour
{
    private void OnTriggerStay(Collider other)
    {
        if (other.gameObject.tag == "Unit")
        {
            Debug.Log("유닛 체력 초당 +20");
        }
    }
}