Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.47 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5.  
  6. public class PlayerController : MonoBehaviour
  7. {
  8. public GameObject waypointPrefab;
  9. public GameObject IslaContainer;
  10. public GameObject Player;
  11. public GameObject RaycastManager;
  12. public Vector3 HeldHitPoint;
  13.  
  14.  
  15. public List<GameObject> waypoints;
  16. private List<GameObject> waypointsToRemove;
  17.  
  18.  
  19. private float walkSpeed = 1.7f;
  20. private float runSpeed = 3.0f;
  21.  
  22. public int[] Directions = { 0, 45, 90, 135, 180, 225, 270, 315, 359 };
  23.  
  24. public int FinalDirectionPass;
  25.  
  26. public int DirectionArrayPosition = 0;
  27.  
  28.  
  29. public Vector3 previousPlayerPosition;
  30. public bool IslaFacingMovingDirection;
  31. public int ArrayCount;
  32. public bool boolTurnElapsed;
  33. public bool StartTurnRoutine;
  34.  
  35. public int KeepCountforQueue = 0;
  36.  
  37.  
  38.  
  39. //public float direction;
  40.  
  41.  
  42.  
  43.  
  44. public Animator Playeranim;
  45.  
  46.  
  47.  
  48. AudioSource audioData;
  49.  
  50.  
  51.  
  52. void Start()
  53. {
  54. previousPlayerPosition = transform.position;
  55. Player.transform.position = DungeonGridManager.CalcGridSnappedPosition(this.transform.position);
  56. waypoints = new List<GameObject>();
  57. waypointsToRemove = new List<GameObject>();
  58. this.SnapPlayerToGrid();
  59. StartCoroutine(ReorientIslasDirectionWhileTurnPasses());
  60.  
  61.  
  62. IslaContainer.transform.rotation = Quaternion.AngleAxis(Directions[DirectionArrayPosition], new Vector3(0, 1, 0));
  63.  
  64.  
  65.  
  66. //In for debug purposes, also a reminder that I'll be expanding this later as
  67. //I want it to check the type of tile based on the tile name next
  68. audioData = GetComponent<AudioSource>();
  69. audioData.Play(0);
  70.  
  71. Playeranim = IslaContainer.GetComponentInChildren<Animator>();
  72. Playeranim.SetBool("Walking", false);
  73.  
  74.  
  75.  
  76.  
  77. }
  78.  
  79.  
  80.  
  81. void SnapPlayerToGrid()
  82. {
  83.  
  84. this.transform.position = DungeonGridManager.CalcGridSnappedPosition(this.transform.position);
  85. }
  86.  
  87.  
  88. void FixedUpdate()
  89. {
  90.  
  91.  
  92.  
  93. IslaContainer.transform.rotation = Quaternion.AngleAxis(Directions[DirectionArrayPosition], new Vector3(0, 1, 0));
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102. if (this.waypoints.Count > 0 && boolTurnElapsed is true)
  103. {
  104.  
  105.  
  106.  
  107. TurnIsla();
  108.  
  109. Vector3 velocity = walkSpeed * Time.deltaTime * (waypoints[0].transform.position - this.transform.position).normalized;
  110.  
  111. this.transform.position += velocity;
  112.  
  113.  
  114. // Thought this might cause slight jitter in movement near
  115. // waypoints, not seeing any such issue yet tho
  116.  
  117. if (velocity.magnitude >= (waypoints[0].transform.position - this.transform.position).magnitude)
  118. {
  119.  
  120. Debug.Log(DirectionArrayPosition);
  121. audioData.Play(0);
  122.  
  123.  
  124.  
  125.  
  126. waypointsToRemove.Add(waypoints[0]);
  127. TurnIsla();
  128. previousPlayerPosition = transform.position;
  129.  
  130. }
  131. }
  132.  
  133. }
  134. void LateUpdate()
  135. {
  136.  
  137.  
  138.  
  139. if (waypoints.Count == 0)
  140. {
  141. Playeranim.SetBool("Walking", false);
  142.  
  143.  
  144. }
  145.  
  146. _UpdateWaypoints();
  147.  
  148. }
  149.  
  150.  
  151.  
  152. //Method handles the management of triggering the ReorientIslasDirectionWhileTurnPasses() method. TurnIsla() goes compares last position saved based on 1). start of script
  153. // or 2). the death of the previous waypoints[0]. The method is called whenever there is movement, and I'm most likely repeating myself at times.
  154. // A way to improve this method, or outright removing it, would be having the dungeonSceneManager's gridcell have DirectionArrayPosition identites that will be read
  155. // by the TurnIsla and allow for ReorientIslasDirectionWhileTurnPasses() to reorient the player in motion. Establishes FinalDirection Pass in order to check
  156. // against the current DirectionArrayPosition which is then modified to match in ReorientIslasDirectionWhileTurnPasses()
  157. int TurnIsla()
  158. {
  159. if (waypoints.Count == 0)
  160. {
  161. this.SnapPlayerToGrid();
  162. return FinalDirectionPass;
  163.  
  164.  
  165. }
  166.  
  167.  
  168.  
  169. //public int[] Directions = { 0, 45, 90, 135, 180, 225, 270, 315, 359 };
  170. // 0 1 2 3 4 5 6 7
  171.  
  172.  
  173. //Up
  174.  
  175. if (waypoints[0].transform.position.x < previousPlayerPosition.x)
  176. {
  177. if (waypoints[0].transform.position.z == previousPlayerPosition.z)
  178. {
  179.  
  180. FinalDirectionPass = 0;
  181. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  182. return FinalDirectionPass;
  183. }
  184.  
  185. else if (waypoints[0].transform.position.z < previousPlayerPosition.z)
  186. {
  187.  
  188. FinalDirectionPass = 7;
  189. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  190. return FinalDirectionPass;
  191. }
  192. else if (waypoints[0].transform.position.z > previousPlayerPosition.z)
  193. {
  194.  
  195. FinalDirectionPass = 1;
  196. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  197. return FinalDirectionPass;
  198. }
  199. else if (FinalDirectionPass != DirectionArrayPosition)
  200. {
  201. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  202. return FinalDirectionPass;
  203. }
  204. }
  205.  
  206. //Down
  207. if (waypoints[0].transform.position.x > previousPlayerPosition.x)
  208. {
  209. if (waypoints[0].transform.position.z > previousPlayerPosition.z)
  210. {
  211.  
  212. FinalDirectionPass = 3;
  213. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  214. return FinalDirectionPass;
  215. }
  216. else if (waypoints[0].transform.position.z < previousPlayerPosition.z)
  217. {
  218.  
  219. FinalDirectionPass = 5;
  220. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  221. return FinalDirectionPass;
  222. }
  223.  
  224. else if (waypoints[0].transform.position.z == previousPlayerPosition.z)
  225. {
  226.  
  227. FinalDirectionPass = 4;
  228. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  229. return FinalDirectionPass;
  230. }
  231.  
  232. else if (FinalDirectionPass != DirectionArrayPosition)
  233. {
  234.  
  235. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  236. return FinalDirectionPass;
  237. }
  238. return FinalDirectionPass;
  239. }
  240.  
  241. //left
  242. if (waypoints[0].transform.position.z > previousPlayerPosition.z)
  243. {
  244. if (FinalDirectionPass != DirectionArrayPosition)
  245. {
  246.  
  247. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  248.  
  249. }
  250. FinalDirectionPass = 2;
  251. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  252. return FinalDirectionPass;
  253. }
  254.  
  255. //right
  256. if (waypoints[0].transform.position.z < previousPlayerPosition.z)
  257. {
  258. if (FinalDirectionPass != DirectionArrayPosition)
  259. {
  260.  
  261. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  262. return FinalDirectionPass;
  263. }
  264.  
  265. FinalDirectionPass = 6;
  266. StartCoroutine("ReorientIslasDirectionWhileTurnPasses");
  267. return FinalDirectionPass;
  268. }
  269. return FinalDirectionPass;
  270. }
  271.  
  272.  
  273. //ReorientIslasDirectionWhileTurnPasses() handles the actual turn of the character. I want to design it to stop the movement, then turn her as it "passes a turn" and then
  274. // continue on through the movement in FixedUpdate(). ReorientIslasDirectionWhileTurnPasses() checks the FinalDirectionPass and DirectionArrayPosition. Originally I had it
  275. // try and increment the turn based on arbitrary moments of .5 seconds that represented an abstraction of a "turn" which would later be subbed in with evoking the
  276. // future turnManager class which will have a Turn() method.
  277.  
  278. IEnumerator ReorientIslasDirectionWhileTurnPasses()
  279. {
  280.  
  281.  
  282.  
  283.  
  284. if ((FinalDirectionPass == DirectionArrayPosition))
  285. {
  286. boolTurnElapsed = true;
  287. }
  288.  
  289.  
  290. if (FinalDirectionPass > DirectionArrayPosition)
  291. {
  292.  
  293. if (FinalDirectionPass > DirectionArrayPosition)
  294. {
  295. boolTurnElapsed = false;
  296.  
  297. yield return DirectionArrayPosition = FinalDirectionPass;
  298.  
  299. if ((FinalDirectionPass == DirectionArrayPosition))
  300. {
  301. yield return FinalDirectionPass == DirectionArrayPosition;
  302. boolTurnElapsed = true;
  303.  
  304.  
  305. }
  306.  
  307.  
  308. }
  309. }
  310. if (FinalDirectionPass < DirectionArrayPosition)
  311. {
  312.  
  313. boolTurnElapsed = false;
  314.  
  315. yield return DirectionArrayPosition = FinalDirectionPass;
  316.  
  317.  
  318. if ((FinalDirectionPass == DirectionArrayPosition))
  319. {
  320. yield return FinalDirectionPass == DirectionArrayPosition;
  321. boolTurnElapsed = true;
  322. }
  323.  
  324.  
  325. }
  326.  
  327. if ((FinalDirectionPass == DirectionArrayPosition))
  328. {
  329. boolTurnElapsed = true;
  330. yield return FinalDirectionPass == DirectionArrayPosition;
  331.  
  332. }
  333.  
  334. }
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342. private void _UpdateWaypoints()
  343. {
  344.  
  345. if (waypointsToRemove.Count > 0)
  346. {
  347. foreach (var pathIndicator in waypointsToRemove)
  348. {
  349. waypoints.Remove(pathIndicator);
  350.  
  351. Destroy(pathIndicator);
  352.  
  353. }
  354.  
  355. waypointsToRemove.Clear();
  356. }
  357.  
  358. if (Input.GetMouseButtonDown(0))
  359. {
  360.  
  361. RaycastHit hit;
  362.  
  363.  
  364.  
  365.  
  366. Playeranim.SetBool("Walking", true);
  367.  
  368. if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100))
  369. {
  370. Debug.DrawLine(Camera.main.transform.position, hit.point, Color.red, 5f);
  371.  
  372.  
  373. HeldHitPoint = hit.point;
  374.  
  375.  
  376. Debug.Log(HeldHitPoint);
  377.  
  378. foreach (var oldCell in waypoints)
  379. {
  380.  
  381. Destroy(oldCell);
  382.  
  383. }
  384. waypoints.Clear();
  385.  
  386. var snappedPosition = DungeonGridManager.CalcGridSnappedPosition(HeldHitPoint);
  387. Debug.Log(snappedPosition); << Speaks back fine, gives me the correct output
  388. var dungeonSceneManager = this.GetDungeonSceneManager();
  389.  
  390. var pathCells = dungeonSceneManager.GetPath(this.transform.position, snappedPosition);
  391. foreach (var pathCell in pathCells) << no pathcells get generated when the camera is 0, 90, 180, 270 or 360.
  392. {
  393. GameObject waypoint = Instantiate(waypointPrefab, pathCell.Position, Quaternion.identity);
  394.  
  395. waypoint.transform.SetParent(this.transform.parent);
  396. waypoints.Add(waypoint);
  397. TurnIsla();
  398. }
  399. }
  400. }
  401.  
  402. }
  403.  
  404.  
  405.  
  406. private DungeonSceneManager GetDungeonSceneManager()
  407. {
  408. return GameObject.FindGameObjectWithTag("DungeonSceneManager").GetComponent<DungeonSceneManager>();
  409. }
  410. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement