171 lines
4.9 KiB
C#
171 lines
4.9 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[RequireComponent(typeof(NPC))]
|
|
[RequireComponent(typeof(NpcDialogueManager))]
|
|
public class NPCFollowing : MonoBehaviour
|
|
{
|
|
private Rigidbody2D myRigidbody;
|
|
public Animator anim;
|
|
|
|
public Vector3 homePosition;
|
|
public Transform targetPosition;
|
|
|
|
public AStarPathfindingAgent agent;
|
|
|
|
//public GameObject player;
|
|
|
|
public bool approaching = false;
|
|
public bool isAfterAction = false;
|
|
public bool isDuringConversation = false;
|
|
public float actionRadius = 1.5f;
|
|
|
|
void Awake()
|
|
{
|
|
agent = GetComponent<AStarPathfindingAgent>();
|
|
}
|
|
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
isAfterAction = System.Convert.ToBoolean(PlayerPrefs.GetInt(gameObject.GetComponent<NPC>().name + ".FirstDialogue"));
|
|
|
|
myRigidbody = GetComponent<Rigidbody2D>();
|
|
anim = GetComponent<Animator>();
|
|
homePosition = new Vector3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z);
|
|
targetPosition = GameObject.FindWithTag("Player").transform;
|
|
|
|
if(!isAfterAction)
|
|
StartCoroutine(WaitBeforStartingAction(5f));
|
|
|
|
}
|
|
|
|
// Update is called once per frame
|
|
public void Update()
|
|
{
|
|
HandleState();
|
|
}
|
|
|
|
private IEnumerator WaitBeforStartingAction(float waitTime)
|
|
{
|
|
while (true)
|
|
{
|
|
yield return new WaitForSeconds(waitTime);
|
|
|
|
// Start story
|
|
approaching = true;
|
|
gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
|
|
}
|
|
}
|
|
|
|
private IEnumerator Wait(float waitTime)
|
|
{
|
|
while (true)
|
|
{
|
|
yield return new WaitForSeconds(waitTime);
|
|
}
|
|
}
|
|
|
|
public void CheckDistance()
|
|
{
|
|
StopAllCoroutines();
|
|
|
|
if (isAfterAction == false)
|
|
{
|
|
if (approaching && Vector2.Distance(targetPosition.position, transform.position) >= actionRadius)
|
|
{
|
|
agent.FindPath();
|
|
|
|
StartCoroutine(agent.FollowPath());
|
|
}
|
|
else if (approaching)
|
|
{
|
|
//start dialogue here
|
|
|
|
gameObject.GetComponent<NPC>().State = NPCStateEnum.Talking;
|
|
|
|
agent.path.Clear(); // if we are able to talgk we dont want go go further player
|
|
}
|
|
}
|
|
|
|
else if (!approaching && isAfterAction)
|
|
{
|
|
Debug.Log(Vector2.Distance(transform.position, homePosition));
|
|
Debug.Log(homePosition);
|
|
if (Vector2.Distance(transform.position, homePosition) > 0.05)
|
|
{
|
|
//transform.position = Vector2.MoveTowards(transform.position, homePosition, 2 * Time.deltaTime);
|
|
agent.point = homePosition;
|
|
|
|
|
|
agent.FindPoint();
|
|
|
|
StartCoroutine(agent.FollowPath());
|
|
}
|
|
else
|
|
{
|
|
gameObject.GetComponent<NPC>().State = NPCStateEnum.Pending;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnTriggerExit2D(Collider2D other)
|
|
{
|
|
// don't listen when component is disabled
|
|
if (!gameObject.GetComponent<NPCFollowing>().enabled)
|
|
return;
|
|
|
|
if (approaching && !isAfterAction)
|
|
{
|
|
gameObject.GetComponent<NpcDialogueManager>().Dialogue.BreakDialogueStep();
|
|
isDuringConversation = false;
|
|
gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
|
|
}
|
|
}
|
|
|
|
public void HandleState()
|
|
{
|
|
switch (gameObject.GetComponent<NPC>().State)
|
|
{
|
|
case NPCStateEnum.Walking:
|
|
{
|
|
CheckDistance();
|
|
break;
|
|
}
|
|
case NPCStateEnum.Talking:
|
|
{
|
|
DoAction();
|
|
break;
|
|
}
|
|
case NPCStateEnum.Pending:
|
|
{
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
Debug.Log("fancy text nie wiem co zrobic");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void DoAction()
|
|
{
|
|
if (approaching == true && isDuringConversation == false && gameObject.GetComponent<NpcDialogueManager>().CanBeOpened)
|
|
{
|
|
isDuringConversation = true;
|
|
gameObject.GetComponent<NpcDialogueManager>().Dialogue.StartDialogue();
|
|
}
|
|
}
|
|
|
|
public void AfterAction()
|
|
{
|
|
approaching = false;
|
|
isAfterAction = true;
|
|
isDuringConversation = false;
|
|
PlayerPrefs.SetInt(gameObject.name + ".FirstDialogue", System.Convert.ToInt32(isAfterAction));
|
|
gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
|
|
}
|
|
}
|