public bool IsOpposite(NeckDirection.Dir a, NeckDirection.Dir b) { if (a == b) { return(false); } if (a == NeckDirection.Dir.down && b == NeckDirection.Dir.up) { return(true); } if (a == NeckDirection.Dir.left && b == NeckDirection.Dir.right) { return(true); } var tmp = b; b = a; a = tmp; if (a == NeckDirection.Dir.down && b == NeckDirection.Dir.up) { return(true); } if (a == NeckDirection.Dir.left && b == NeckDirection.Dir.right) { return(true); } return(false); }
public Vector2 Dir2V(NeckDirection.Dir dir) { switch (dir) { case NeckDirection.Dir.up: return(Vector2.up); case NeckDirection.Dir.down: return(Vector2.down); case NeckDirection.Dir.left: return(Vector2.left); case NeckDirection.Dir.right: return(Vector2.right); default: return(Vector2.zero); } }
void DoNeckMovement() { Vector2 input = new Vector2(Input.GetAxis("Neck Horizontal"), Input.GetAxis("Neck Vertical")); var direction = V2Dir(input); audioSource.volume = (direction.distance < 2) ? 0 : 0.5f; if (direction.distance == 0) { return; } if (neckMovement.Count == 0) { neckMovement.Add(direction); } // Snap the neck back when is in the error margin if (neckMovement.Last().distance < 2 && neckMovement.Last().direction != direction.direction) { neckMovement.Remove(neckMovement.Last()); } if (neckMovement.Count == 0) { return; } if (neckMovement.Last().distance < 40 && neckMovement.Count > 1) { if (IsOpposite(neckMovement[neckMovement.Count - 2].direction, direction.direction)) { neckMovement.Remove(neckMovement.Last()); } } if (neckMovement.Last().distance < 10 && neckMovement.Count > 1) { if (neckMovement[neckMovement.Count - 2].direction == direction.direction) { neckMovement.Remove(neckMovement.Last()); } } if (neckMovement.Last().direction == NeckDirection.Dir.right || neckMovement.Count == 1) { destHeadRotation = Quaternion.Euler(-90, 0, -90); lastDir = NeckDirection.Dir.right; } else if (neckMovement.Last().direction == NeckDirection.Dir.left) { destHeadRotation = Quaternion.Euler(-90, 180, -90); lastDir = NeckDirection.Dir.left; } currentLength = CalculateNeckLength(neckMovement); if (neckMovement.Last().direction == direction.direction && currentLength < maxLength && CanMove(neckMovement, direction, Time.fixedDeltaTime)) { neckMovement.Last().distance += direction.distance; } else if (IsOpposite(neckMovement.Last().direction, direction.direction) && CanMove(neckMovement, direction, Time.fixedDeltaTime)) { neckMovement.Last().distance -= direction.distance; } else if (currentLength < maxLength && CanMove(neckMovement, direction, Time.fixedDeltaTime)) { neckMovement.Add(direction); } }