nPC decision
This commit is contained in:
parent
2c099c15fe
commit
90d52d491e
8
Assets/Scripts/NPC/NPCBrainSystem/DecisionTypes.meta
Normal file
8
Assets/Scripts/NPC/NPCBrainSystem/DecisionTypes.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 56939ec6b1c7ba4418f60df6bf032cd8
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,17 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public abstract class NPCDecision : ScriptableObject
|
||||||
|
{
|
||||||
|
protected Coroutine executeRoutine;
|
||||||
|
|
||||||
|
public abstract IEnumerator ExecuteCoroutine(NPCBrain npc);
|
||||||
|
public void Execute(NPCBrain npc)
|
||||||
|
{
|
||||||
|
executeRoutine = npc.StartCoroutine(ExecuteCoroutine(npc));
|
||||||
|
}
|
||||||
|
public abstract void Interrupt(NPCBrain npc);
|
||||||
|
|
||||||
|
public bool IsRunning() => executeRoutine != null;
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.AI;
|
||||||
|
using UnityEngine.Events;
|
||||||
|
|
||||||
|
[CreateAssetMenu(fileName = "PatrolDecision", menuName = "RiftMayhem/AI/Decisions/Patrol")]
|
||||||
|
public class NPCPatrolDecision : NPCDecision
|
||||||
|
{
|
||||||
|
[Header("Settings:")]
|
||||||
|
[SerializeField] private float distanceToChangePatrolDestination;
|
||||||
|
[SerializeField] private float patrolAgentSpeed;
|
||||||
|
|
||||||
|
NavMeshAgent agent;
|
||||||
|
Vector3 patrolDestination = new Vector3();
|
||||||
|
|
||||||
|
public UnityEvent OnPatrolReachedDestination = new UnityEvent();
|
||||||
|
|
||||||
|
|
||||||
|
public override IEnumerator ExecuteCoroutine(NPCBrain npc)
|
||||||
|
{
|
||||||
|
SetupAgent(npc);
|
||||||
|
|
||||||
|
StartPatrollingToNewPosition();
|
||||||
|
|
||||||
|
yield return new WaitUntil(() => IsPathComplete());
|
||||||
|
|
||||||
|
OnPatrolReachedDestination.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Interrupt(NPCBrain npc)
|
||||||
|
{
|
||||||
|
if (executeRoutine != null)
|
||||||
|
npc.StopCoroutine(executeRoutine);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Helpers
|
||||||
|
protected void StartPatrollingToNewPosition()
|
||||||
|
{
|
||||||
|
agent.speed = patrolAgentSpeed;
|
||||||
|
|
||||||
|
patrolDestination.x = Random.Range(-5, 5);
|
||||||
|
patrolDestination.y = 0f;
|
||||||
|
patrolDestination.z = Random.Range(-5, 5);
|
||||||
|
|
||||||
|
agent.SetDestination(agent.transform.position + patrolDestination);
|
||||||
|
agent.isStopped = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool IsPathComplete()
|
||||||
|
{
|
||||||
|
if (Vector3.Distance(agent.destination, agent.transform.position) <= agent.stoppingDistance)
|
||||||
|
{
|
||||||
|
if (!agent.hasPath || agent.velocity.sqrMagnitude == 0f)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void SetupAgent(NPCBrain npc)
|
||||||
|
{
|
||||||
|
agent = npc.Agent;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cc8abedb55d773e46aab9bba344516df
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -1,10 +1,25 @@
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using UnityEngine.AI;
|
||||||
|
|
||||||
public class NPCBrain : MonoBehaviour
|
public class NPCBrain : MonoBehaviour
|
||||||
{
|
{
|
||||||
|
[Header("Decision Profile")]
|
||||||
|
[SerializeField] private NPCDecisionProfile decisionProfile;
|
||||||
|
|
||||||
|
NavMeshAgent agent;
|
||||||
|
public NavMeshAgent Agent => agent;
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
StartCoroutine(Decide());
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator Decide()
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
public abstract class NPCDecision : ScriptableObject
|
|
||||||
{
|
|
||||||
public abstract void Execute(NPCController npc);
|
|
||||||
}
|
|
@ -94,7 +94,7 @@ Material:
|
|||||||
- _Mode: 0
|
- _Mode: 0
|
||||||
- _OcclusionStrength: 1
|
- _OcclusionStrength: 1
|
||||||
- _Parallax: 0.02
|
- _Parallax: 0.02
|
||||||
- _Rotation: 11.08514
|
- _Rotation: 12.507187
|
||||||
- _SmoothnessTextureChannel: 0
|
- _SmoothnessTextureChannel: 0
|
||||||
- _SpecularHighlights: 1
|
- _SpecularHighlights: 1
|
||||||
- _SrcBlend: 1
|
- _SrcBlend: 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user