private void FixedUpdate() { switch (mode) { case EMode.gOut: // Крюк брошен p1 += directions[facing] * (grappleSpd * Time.fixedDeltaTime); grapHead.transform.position = p1; grapLine.SetPosition(1, p1); // Проверить, попал ли крюк куда нибудь int tileNum = TileCamera.GET_MAP(p1.x, p1.y); if (grappleTiles.IndexOf(tileNum) != -1) { // Крюк попал на плитку, за которую можно зацепиться! mode = EMode.gInHit; break; } if ((p1 - p0).magnitude >= grappleLength) { // Крюк улетел на всю длину веревки, но никуда не попал mode = EMode.gInMiss; } break; case EMode.gInMiss: // Игрок промахнулся, вернуть крюк на удвоенной скорости p1 -= directions[facing] * (2 * grappleSpd * Time.fixedDeltaTime); if (Vector3.Dot((p1 - p0), directions[facing]) > 0) { // Крюк еще перед дреем grapHead.transform.position = p1; grapLine.SetPosition(1, p1); } else { StopGrapple(); } break; case EMode.gInHit: // Крюк зацепился, поднять дрея на стену var dist = grappleInLength + grappleSpd * Time.fixedDeltaTime; if (dist > (p1 - p0).magnitude) { p0 = p1 - (directions[facing] * grappleInLength); transform.position = p0; StopGrapple(); break; } p0 += directions[facing] * (grappleSpd * Time.fixedDeltaTime); transform.position = p0; grapLine.SetPosition(0, p0); grapHead.transform.position = p1; break; } }
private void StopGrapple() { dray.enabled = true; drayColld.enabled = true; // Проверить безопасность плитки var tileNum = TileCamera.GET_MAP(p0.x, p0.y); if (mode == EMode.gInHit && unsafeTiles.IndexOf(tileNum) != -1) { // Дрей попал не небезопасную плитку dray.ResetInRoom(unsafeTileHealthPenalty); } grapHead.SetActive(false); mode = EMode.none; }
/// <summary> /// Установить свойство плитки. /// </summary> /// <param name="eTileNum"> Необязательный параметр </param> public void SetTile(int eX, int eY, int eTileNum = -1) { x = eX; y = eY; transform.localPosition = new Vector3(x, y, 0); // Вернуть строку в заданном формате. "D" - строка должна представлять число в десятичной СС, "3" - строка должна содержать не менее 3-ех сиволов gameObject.name = x.ToString("D3") + "x" + y.ToString("D3"); if (eTileNum == -1) // Если параметр не был передан.. { eTileNum = TileCamera.GET_MAP(x, y); //.. то он будет получен вызовом GET_MAP } else { TileCamera.SET_MAP(x, y, eTileNum); // Заменить плитку, если необходимо } tileNum = eTileNum; GetComponent <SpriteRenderer>().sprite = TileCamera.SPRITES[tileNum]; // Присвоить спрайт плитке SetCollider(); }