Ejemplo n.º 1
0
	/// <summary>Filters the direction.</summary>
	/// <returns>The direction.</returns>
	/// <param name="dir">Dir.</param>
	/// <param name="dirs">Dirs.</param>
	/// <param name="minimumMoveAlignment">Minimum move alignment. from 0 to 1, the minimum Dot product for moving</param>
	public Vector3 FilterDirection(Vector3 dir, DirectionMovementIsPossible dirs, float minimumMoveAlignment = 0) {
		if (dir == Vector3.zero || dirs == DirectionMovementIsPossible.none) return Vector3.zero;
		float fdot = Vector3.Dot (dir, transform.forward);
		switch (dirs) {
		case DirectionMovementIsPossible.all: break;
		case DirectionMovementIsPossible.forwardOnly:
			if (fdot > 0 && (minimumMoveAlignment <= 0 || fdot > minimumMoveAlignment))
			{ dir = transform.forward; } else { dir = Vector3.zero; } break;
		case DirectionMovementIsPossible.forwardOrBackward:
			if (fdot != 0 && (minimumMoveAlignment <= 0 || Mathf.Abs(fdot) > minimumMoveAlignment)) 
			{ dir = transform.forward * Mathf.Sign(fdot); } else { dir = Vector3.zero; } break;
		case DirectionMovementIsPossible.wasd: {
				float rdot = Vector3.Dot (dir, transform.right);
				if (Mathf.Abs (rdot) > Mathf.Abs (fdot)) { 
					if(minimumMoveAlignment <= 0 || Mathf.Abs(rdot) > minimumMoveAlignment)
					{ dir = transform.right * Mathf.Sign (rdot); } else { dir = Vector3.zero; }
				}
				else if(minimumMoveAlignment <= 0 || Mathf.Abs(fdot) > minimumMoveAlignment)
				{ dir = transform.forward * Mathf.Sign(fdot); } else { dir = Vector3.zero; }
			} break;
		}
		return dir;
	}
Ejemplo n.º 2
0
	/// <summary>call this during a FixedUpdate process to give this agent simple AI movement</summary>
	public void Seek(Vector3 target, DirectionMovementIsPossible dirs = DirectionMovementIsPossible.all, 
		float minimumMoveAlignment = 1-1.0f/128, bool stopIfAlignmentIsntGoodEnough = true) {
		CalculateSeek (CalculatePositionForAutomaticMovement(target), out MoveDirection, ref LookDirection);
		if (dirs != DirectionMovementIsPossible.all) { MoveDirection = FilterDirection (MoveDirection, dirs, minimumMoveAlignment); }
		if (stopIfAlignmentIsntGoodEnough && MoveDirection == Vector3.zero && Acceleration > 0) { IsBrakeOn = true; }
	}