|
|
|
@ -21,9 +21,11 @@ public class AbilitySystem : NetworkBehaviour
|
|
|
|
|
[SerializeField] private Material invalidPlacementMaterial;
|
|
|
|
|
|
|
|
|
|
[Header("Wall Placement Settings")]
|
|
|
|
|
[SerializeField] private float wallRotationSpeed = 1.2f;
|
|
|
|
|
[SerializeField] private float wallRotationSpeed = 0.5f;
|
|
|
|
|
[SerializeField] private LayerMask playerLayer; // Layer for detecting players
|
|
|
|
|
[SerializeField] private float mouseMoveThreshold = 0.1f; // Minimum mouse movement threshold
|
|
|
|
|
|
|
|
|
|
private Vector3 initialMousePosition;
|
|
|
|
|
private Vector3 wallSpawnPosition;
|
|
|
|
|
private bool isWallPlacementStarted = false;
|
|
|
|
|
private bool isValidPlacement = true;
|
|
|
|
@ -106,21 +108,8 @@ public class AbilitySystem : NetworkBehaviour
|
|
|
|
|
{
|
|
|
|
|
wallIndicator.transform.position = hit.point; // Update position to follow the mouse
|
|
|
|
|
|
|
|
|
|
// Calculate half-extents based on wall's current scale
|
|
|
|
|
Vector3 halfExtents = new Vector3(
|
|
|
|
|
wallIndicator.transform.localScale.x / 2f,
|
|
|
|
|
wallIndicator.transform.localScale.y / 2f,
|
|
|
|
|
wallIndicator.transform.localScale.z / 2f
|
|
|
|
|
);
|
|
|
|
|
isValidPlacement = IsPlacementValid(hit.point, wallIndicator.transform.rotation, playerLayer);
|
|
|
|
|
|
|
|
|
|
// Perform BoxCast aligned with the wall's orientation
|
|
|
|
|
isValidPlacement = !Physics.CheckBox(
|
|
|
|
|
hit.point,
|
|
|
|
|
halfExtents,
|
|
|
|
|
wallIndicator.transform.rotation,
|
|
|
|
|
playerLayer
|
|
|
|
|
);
|
|
|
|
|
// Change indicator color based on placement validity
|
|
|
|
|
var meshRenderer = wallIndicator.GetComponent<MeshRenderer>();
|
|
|
|
|
if (meshRenderer != null)
|
|
|
|
|
{
|
|
|
|
@ -136,6 +125,7 @@ public class AbilitySystem : NetworkBehaviour
|
|
|
|
|
if (isValidPlacement)
|
|
|
|
|
{
|
|
|
|
|
wallSpawnPosition = hit.point; // Save spawn position
|
|
|
|
|
initialMousePosition = Input.mousePosition; // Store the initial mouse position on click
|
|
|
|
|
isWallPlacementStarted = true;
|
|
|
|
|
Debug.Log($"[AbilitySystem] Wall placement started at {wallSpawnPosition}");
|
|
|
|
|
}
|
|
|
|
@ -150,17 +140,60 @@ public class AbilitySystem : NetworkBehaviour
|
|
|
|
|
{
|
|
|
|
|
if (isWallPlacementStarted && wallIndicator != null)
|
|
|
|
|
{
|
|
|
|
|
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
|
|
|
|
|
// Get the current mouse position in screen space
|
|
|
|
|
Vector3 currentMousePosition = Input.mousePosition;
|
|
|
|
|
|
|
|
|
|
// Calculate the distance the mouse has moved since the initial click
|
|
|
|
|
float mouseDistance = Vector3.Distance(initialMousePosition, currentMousePosition);
|
|
|
|
|
|
|
|
|
|
// Check if the movement exceeds the threshold
|
|
|
|
|
if (mouseDistance >= mouseMoveThreshold)
|
|
|
|
|
{
|
|
|
|
|
Ray ray = Camera.main.ScreenPointToRay(currentMousePosition);
|
|
|
|
|
if (Physics.Raycast(ray, out RaycastHit hit))
|
|
|
|
|
{
|
|
|
|
|
Vector3 direction = (hit.point - wallIndicator.transform.position).normalized;
|
|
|
|
|
float angle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
|
|
|
|
|
Quaternion targetRotation = Quaternion.Euler(0f, angle, 0f);
|
|
|
|
|
wallIndicator.transform.rotation = Quaternion.Lerp(wallIndicator.transform.rotation, targetRotation, Time.deltaTime * wallRotationSpeed);
|
|
|
|
|
|
|
|
|
|
// Smooth rotation with Lerp
|
|
|
|
|
wallIndicator.transform.rotation = targetRotation;
|
|
|
|
|
// wallIndicator.transform.rotation = Quaternion.Lerp(wallIndicator.transform.rotation, targetRotation, Time.deltaTime * wallRotationSpeed);
|
|
|
|
|
isValidPlacement = IsPlacementValid(wallIndicator.transform.position, wallIndicator.transform.rotation, playerLayer);
|
|
|
|
|
|
|
|
|
|
// Change indicator color based on placement validity
|
|
|
|
|
var meshRenderer = wallIndicator.GetComponent<MeshRenderer>();
|
|
|
|
|
if (meshRenderer != null)
|
|
|
|
|
{
|
|
|
|
|
meshRenderer.material = isValidPlacement ? validPlacementMaterial : invalidPlacementMaterial;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isValidPlacement)
|
|
|
|
|
{
|
|
|
|
|
Debug.Log("Cannot rotate wall here: Overlapping with another object.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private bool IsPlacementValid(Vector3 position, Quaternion rotation, LayerMask layerMask)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// Perform overlap check after applying rotation
|
|
|
|
|
Vector3 halfExtents = new Vector3(
|
|
|
|
|
wallIndicator.transform.localScale.x / 2f,
|
|
|
|
|
wallIndicator.transform.localScale.y / 2f,
|
|
|
|
|
wallIndicator.transform.localScale.z / 2f
|
|
|
|
|
);
|
|
|
|
|
// Perform a CheckBox for the given parameters
|
|
|
|
|
bool isOverlap = Physics.CheckBox(position, halfExtents, rotation, layerMask);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return !isOverlap; // Return true if valid placement (no overlap)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ManageStandardAbilityIndicator()
|
|
|
|
|
{
|
|
|
|
|
if (currentAbilityIndicator != null)
|
|
|
|
|