public void SetWalkVector(Vector3 new_walkTarget, float baseSpeed) { //mozna zakomentowac ten warunek i wtedy kazdy NPC bedzie w trakcie ruchu aktualizowac sobie trase co kazdy thinking time, bedzie mniej optymalnie, ale nie bedzie "potkniec" w ich ruchu na koncach grida if (corvoPathFinder != null && ((_walkTarget - new_walkTarget).magnitude > 0.01f || (!corvoPathFinder.havePath() && !corvoPathFinder.isCalculating()))) { _walkTarget = new_walkTarget; _isWalkTargetSet = true; _distanceCalcTimer = 0; _lastDistance = Vector3.Distance(_walkTarget, _wholeNPC.transform.position); CorrectGrid(); _wholeNPC.SetWalkSpeedAnim(baseSpeed); _lookDirection = Quaternion.LookRotation(_walkTarget - _wholeNPC.transform.position, _wholeNPC.transform.up); pathFinder.speed = baseSpeed; pathFinder.goTo(_walkTarget); } }
void SetTargetPosition() { //Plane plane = new Plane(Vector3.up, transform.position); RaycastHit hit; Ray rayFromCamera = Camera.main.ScreenPointToRay(Input.mousePosition); //float point = 0f; if (true == (Physics.Raycast(rayFromCamera.origin, rayFromCamera.direction * 10, out hit))) { Vector3 gridPoint = Vector3Util.GridVector(hit.point); // 이동해야할 위치의 x, z좌표 Collider selectedObjCollider = hit.collider; GameObject obj = hit.collider.gameObject; gridPosition = gridPoint; { int j = 1; for (int i = 0; i < 10; i++) { Ray rayDown = new Ray(gridPoint + Vector3.up * j / 2, Vector3.down * j); if (selectedObjCollider.Raycast(rayDown, out hit, j)) //if (Physics.Raycast(rayDown, out hit)) // 위로 광선을 쐈는데 터치된 오브젝트에 닿음 { targetPosition = hit.point; } j *= 2; } } Vector3 a = targetPosition; if (!pathFindingTest) { unitPathFinder.goTo(targetPosition); } else { GetComponent <CorvoPathFinder>().findPath(targetPosition); } } }