fixed bow cobat, still not 100% on accuracy
This commit is contained in:
@@ -323,20 +323,51 @@ public class BowAimLayerController : MonoBehaviour
|
|||||||
// Laser Sight Gizmo
|
// Laser Sight Gizmo
|
||||||
if (_isAiming && _arrowSpawnPoint != null && _camera != null)
|
if (_isAiming && _arrowSpawnPoint != null && _camera != null)
|
||||||
{
|
{
|
||||||
Vector3 aimPoint;
|
Vector3 aimPoint = GetCrosshairAimPoint();
|
||||||
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);
|
|
||||||
}
|
|
||||||
Debug.DrawLine(_arrowSpawnPoint.position, aimPoint, Color.red);
|
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()
|
private void UpdateDrawAndFire()
|
||||||
{
|
{
|
||||||
// The Synty InputReader doesn't have an attack action, so we read
|
// 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!
|
// Auto aim directly at the locked on target's chest!
|
||||||
aimPoint = playerController.CurrentLockOnTarget.transform.position + (Vector3.up * 1.2f);
|
aimPoint = playerController.CurrentLockOnTarget.transform.position + (Vector3.up * 1.2f);
|
||||||
}
|
Debug.Log($"[Bow Debug] Locked on! Auto-aiming at: {aimPoint}");
|
||||||
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;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// If we are looking into the sky, aim far out into the distance
|
|
||||||
aimPoint = ray.GetPoint(100f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
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
|
// 2. Unparent the arrow from the hand/string
|
||||||
_loadedArrow.transform.SetParent(null);
|
_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
|
// 3. Point the arrow exactly at the target
|
||||||
_loadedArrow.transform.LookAt(aimPoint);
|
_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)
|
// 4. Get the damage from the current weapon (default to 10 if none)
|
||||||
float damage = _currentWeapon != null ? _currentWeapon.damage : 10f;
|
float damage = _currentWeapon != null ? _currentWeapon.damage : 10f;
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ public class Projectile : MonoBehaviour
|
|||||||
Destroy(gameObject, lifetime);
|
Destroy(gameObject, lifetime);
|
||||||
|
|
||||||
_startPosition = transform.position;
|
_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()
|
private void Start()
|
||||||
|
|||||||
Reference in New Issue
Block a user