fixed bow cobat, still not 100% on accuracy

This commit is contained in:
2026-10-01 09:34:10 +01:00
parent 4980fb8128
commit 163939dab8
2 changed files with 49 additions and 25 deletions

View File

@@ -323,20 +323,51 @@ public class BowAimLayerController : MonoBehaviour
// Laser Sight Gizmo
if (_isAiming && _arrowSpawnPoint != null && _camera != null)
{
Vector3 aimPoint;
Ray ray = _camera.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));
if (Physics.Raycast(ray, out RaycastHit hit, 100f, _targetLayers))
{
aimPoint = hit.point;
}
else
{
aimPoint = ray.GetPoint(100f);
}
Vector3 aimPoint = GetCrosshairAimPoint();
Debug.DrawLine(_arrowSpawnPoint.position, aimPoint, Color.red);
}
}
private Vector3 GetCrosshairAimPoint()
{
if (_camera == null) return transform.position + transform.forward * 100f;
Ray ray = _camera.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));
// EXTREMELY IMPORTANT: Ignore triggers! Otherwise we might hit invisible lock-on spheres or interact zones!
RaycastHit[] hits = Physics.RaycastAll(ray, 100f, _targetLayers, QueryTriggerInteraction.Ignore);
float closestDistance = float.MaxValue;
Vector3 aimPoint = ray.GetPoint(100f);
foreach (var hit in hits)
{
// IGNORE THE PLAYER! If the raycast hits our own body, skip it!
if (hit.collider.transform.root == transform.root) continue;
// IGNORE ARROWS!
if (hit.collider.GetComponent<Projectile>() != null) continue;
if (hit.distance < closestDistance)
{
closestDistance = hit.distance;
aimPoint = hit.point;
}
}
// PARALLAX FIX:
// Because the camera is offset over the right shoulder, if you aim at something very close (like 1m away),
// the arrow (in the left hand) has to violently turn sideways to cross the screen and hit that close point.
// By forcing the aim point to be at least 10 meters away along the same sightline,
// we guarantee the arrow always fires mostly straight forward, completely eliminating wild sideways shots!
if (closestDistance < 4f)
{
aimPoint = ray.GetPoint(15f);
}
return aimPoint;
}
private void UpdateDrawAndFire()
{
// The Synty InputReader doesn't have an attack action, so we read
@@ -453,31 +484,22 @@ public class BowAimLayerController : MonoBehaviour
{
// Auto aim directly at the locked on target's chest!
aimPoint = playerController.CurrentLockOnTarget.transform.position + (Vector3.up * 1.2f);
}
else if (_camera != null)
{
Ray ray = _camera.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));
if (Physics.Raycast(ray, out RaycastHit hit, 100f, _targetLayers))
{
aimPoint = hit.point;
Debug.Log($"[Bow Debug] Locked on! Auto-aiming at: {aimPoint}");
}
else
{
// If we are looking into the sky, aim far out into the distance
aimPoint = ray.GetPoint(100f);
}
}
else
{
aimPoint = _arrowSpawnPoint.position + transform.forward * 100f;
aimPoint = GetCrosshairAimPoint();
Debug.Log($"[Bow Debug] Calculated AimPoint from Crosshair: {aimPoint}");
}
// 2. Unparent the arrow from the hand/string
_loadedArrow.transform.SetParent(null);
Debug.Log($"[Bow Debug] Arrow physically starts at: {_loadedArrow.transform.position}. Aim Point is at: {aimPoint}.");
// 3. Point the arrow exactly at the target
_loadedArrow.transform.LookAt(aimPoint);
Debug.Log($"[Bow Debug] After LookAt, arrow is rotated to: {_loadedArrow.transform.eulerAngles}.");
// 4. Get the damage from the current weapon (default to 10 if none)
float damage = _currentWeapon != null ? _currentWeapon.damage : 10f;

View File

@@ -40,6 +40,8 @@ public class Projectile : MonoBehaviour
Destroy(gameObject, lifetime);
_startPosition = transform.position;
Debug.Log($"[Projectile Debug] Initialized! Final Start Pos: {_startPosition}. Forward Vector: {transform.forward}. BaseSpeed: {speed}. PowerMult: {powerMultiplier:F2}. Final Velocity Magnitude: {_velocity.magnitude:F2}");
}
private void Start()