GameDev RPG Project Code Work
using System.Collections;
using System.Collections.Generic;
using RPG.Core;
using RPG.Movement;
using UnityEngine;
namespace RPG.Combat
{
public class Fighter : MonoBehaviour, IAction
{
[SerializeField] float weaponRange = 2f;
[SerializeField] float timeBetweenAttacks = 1f;
[SerializeField] float weaponDamage = 5f;
Transform target;
float timeSinceLastAttack = 0f;
// Start is called before the first frame update
// void Start(){}
// Update is called once per frame
void Update()
{
timeSinceLastAttack += Time.deltaTime;
if (target == null) return;
if (!GetIsInRange())
{
GetComponent<Mover>().MoveTo(target.position);
}
else
{
GetComponent<Mover>().Cancel();
AttackBehaviour();
}
}
private void AttackBehaviour()
{
if (timeSinceLastAttack > timeBetweenAttacks)
{
// This will trigger the Hit() event
GetComponent<Animator>().SetTrigger("attack");
timeSinceLastAttack = 0f;
}
}
// Animation Event
void Hit()
{
if (!target) return;
Health health = target.GetComponent<Health>();
health.TakeDamage(weaponDamage);
}
private bool GetIsInRange()
{
return Vector3.Distance(transform.position, target.position) < weaponRange;
}
public void Attack(CombatTarget combatTarget)
{
GetComponent<ActionScheduler>().StartAction(this);
target = combatTarget.transform;
}
public void Cancel()
{
GetComponent<Animator>().SetTrigger("stopAttack");
target = null;
}
}
}
====================================================================================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RPG.Combat
{
public class Health : MonoBehaviour
{
[SerializeField] float healthPoints = 100f;
bool isDead = false;
// Start is called before the first frame update
// void Start(){}
// Update is called once per frame
// void Update(){}
public void TakeDamage(float damage)
{
healthPoints = Mathf.Max(healthPoints - damage, 0);
if (healthPoints == 0)
{
Die();
}
}
private void Die()
{
if (isDead) return;
isDead = true;
GetComponent<Animator>().SetTrigger("die");
}
}
}
===============================================================================================================
using System;
using System.Collections;
using System.Collections.Generic;
using RPG.Core;
using UnityEngine;
using UnityEngine.AI;
namespace RPG.Movement
{
public class Mover : MonoBehaviour, IAction
{
[SerializeField] Transform target;
NavMeshAgent navMeshAgent;
// Start is called before the first frame update
void Start()
{
navMeshAgent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
UpdateAnimator();
}
public void StartMoveAction(Vector3 destination)
{
GetComponent<ActionScheduler>().StartAction(this);
MoveTo(destination);
}
public void MoveTo(Vector3 destination)
{
navMeshAgent.destination = destination;
navMeshAgent.isStopped = false;
}
public void Cancel()
{
navMeshAgent.isStopped = true;
}
private void UpdateAnimator()
{
Vector3 velocity = navMeshAgent.velocity;
Vector3 localVelocity = transform.InverseTransformDirection(velocity);
float speed = localVelocity.z;
GetComponent<Animator>().SetFloat("forwardSpeed", speed);
}
}
}
============================================================================================================
using System;
using System.Collections;
using System.Collections.Generic;
using RPG.Combat;
using RPG.Movement;
using UnityEngine;
namespace RPG.Control
{
public class PlayerController : MonoBehaviour
{
// Start is called before the first frame update
// void Start(){}
// Update is called once per frame
void Update()
{
if (InteractWithCombat()) return;
if (InteractWithMovement()) return;
}
private bool InteractWithCombat()
{
RaycastHit[] hits = Physics.RaycastAll(GetMouseRay());
foreach (RaycastHit hit in hits)
{
CombatTarget target = hit.transform.GetComponent<CombatTarget>();
if(target == null) continue;
if (Input.GetMouseButtonDown(0))
{
GetComponent<Fighter>().Attack(target);
}
return true;
}
return false;
}
private bool InteractWithMovement()
{
RaycastHit hit;
bool hasHit = Physics.Raycast(GetMouseRay(), out hit);
if (hasHit)
{
if (Input.GetMouseButton(0))
{
GetComponent<Mover>().StartMoveAction(hit.point);
}
return true;
}
return false;
}
private static Ray GetMouseRay()
{
return Camera.main.ScreenPointToRay(Input.mousePosition);
}
}
}
=====================================================================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RPG.Core
{
public class ActionScheduler : MonoBehaviour
{
IAction currentAction;
// Start is called before the first frame update
// void Start(){}
// Update is called once per frame
// void Update(){}
public void StartAction(IAction action)
{
if (currentAction == null) return;
if (currentAction != null)
{
currentAction.Cancel();
}
currentAction = action;
}
}
}
=======================================================================================================
namespace RPG.Core
{
public interface IAction
{
void Cancel();
}
}