separated logic for weapon code refactored

This commit is contained in:
Mausham
2025-12-30 12:43:44 -08:00
parent 37dd15d1b9
commit 1a61f3c506
19 changed files with 157 additions and 191 deletions

View File

@@ -16,6 +16,7 @@ namespace Darkmatter.App
[SerializeField] private PlayerConfigSO playerConfig;
[SerializeField] private CameraConfigSO cameraConfig;
[SerializeField] private GunWeapon gunWeapon;
[SerializeField] private TargetProvider TargetProvider;
protected override void Configure(IContainerBuilder builder)
{
builder.RegisterEntryPoint<PlayerController>(Lifetime.Scoped);
@@ -24,7 +25,7 @@ namespace Darkmatter.App
builder.RegisterComponent<IPlayerAnim>(playerAnim);
builder.RegisterComponent<IInputReader>(inputReader);
builder.RegisterComponent<IPlayerPawn>(playerMotor);
builder.RegisterComponent<ITargetProvider>(TargetProvider);
builder.RegisterComponent(playerConfig);
builder.RegisterComponent(cameraConfig);
builder.RegisterComponent<IWeapon>(gunWeapon);

View File

@@ -1,9 +0,0 @@
using UnityEngine;
namespace Darkmatter.Core
{
public interface IAimProvider
{
public Vector3 AimDir { get; set; }
}
}

View File

@@ -4,7 +4,6 @@ namespace Darkmatter.Core
{
public interface IPlayerPawn
{
Camera mainCamera { get; }
bool isGrounded { get; }
void Jump(float jumpForce);

View File

@@ -0,0 +1,9 @@
using UnityEngine;
namespace Darkmatter.Core
{
public interface ITargetProvider
{
public RaycastHit hitPoint { get; }
}
}

View File

@@ -4,6 +4,6 @@ namespace Darkmatter.Core
{
public interface ICameraService
{
Camera mainCamera { get; }
}
}

View File

@@ -1,4 +1,5 @@
using Darkmatter.Core;
using System;
using UnityEngine;
namespace Darkmatter.Domain
@@ -17,9 +18,15 @@ namespace Darkmatter.Domain
public override void Update()
{
HandlePlayerMovement();
HandleShoooting();
CheckForStateBreak();
}
private void HandleShoooting()
{
runner.Shoot(inputReader.isShooting);
}
public override void LateUpdate()
{
HandlePlayerRotation();
@@ -44,7 +51,7 @@ namespace Darkmatter.Domain
private void CheckForStateBreak()
{
if (runner.playerController.isGrounded)
if (runner.playerPawn.isGrounded)
{
runner.ChangeState(new LocomotionState(runner));
}

View File

@@ -19,10 +19,16 @@ namespace Darkmatter.Domain
public override void Update()
{
HandlePlayerMovement();
HandleShooting();
CheckForStateBreak();
}
private void HandleShooting()
{
runner.Shoot(inputReader.isShooting);
}
public override void LateUpdate()
{
HandlePlayerRotation();
@@ -39,7 +45,7 @@ namespace Darkmatter.Domain
private void CheckForStateBreak()
{
if (!runner.playerController.isGrounded)
if (!runner.playerPawn.isGrounded)
{
runner.ChangeState(new AirboneState(runner));
}
@@ -57,7 +63,7 @@ namespace Darkmatter.Domain
private void HandlePlayerJump()
{
runner.playerController.Jump(playerConfig.jumpForce);
runner.playerPawn.Jump(playerConfig.jumpForce);
playerAnim.PlayJumpAnim();
}

View File

@@ -6,9 +6,12 @@ namespace Darkmatter.Domain
{
public class PlayerStateMachine : StateMachine
{
[Inject] public readonly IPlayerPawn playerController;
[Inject] public readonly IPlayerPawn playerPawn;
[Inject] public readonly IInputReader inputReader;
[Inject] public readonly IPlayerAnim playerAnim;
[Inject] public readonly ITargetProvider targetProvider;
[Inject] public readonly ICameraService cameraService;
[Inject] public readonly IWeapon GunWeapon;
[Inject] public readonly PlayerConfigSO playerConfig;
[Inject] public readonly CameraConfigSO cameraConfig;
@@ -19,8 +22,8 @@ namespace Darkmatter.Domain
public void Move(Vector2 moveInputDir, float moveSpeed)
{
//player movement with reference to camera
Vector3 cameraForward = playerController.mainCamera.transform.forward;
Vector3 cameraRight = playerController.mainCamera.transform.right;
Vector3 cameraForward =cameraService.mainCamera.transform.forward;
Vector3 cameraRight = cameraService.mainCamera.transform.right;
cameraForward.y = 0f;
cameraRight.y = 0f;
@@ -30,7 +33,7 @@ namespace Darkmatter.Domain
moveDir = cameraRight * moveInputDir.x + cameraForward * moveInputDir.y;
playerController.Move(moveDir * moveSpeed);
playerPawn.Move(moveDir * moveSpeed);
playerAnim.PlayMovementAnim(moveInputDir);
}
@@ -43,7 +46,17 @@ namespace Darkmatter.Domain
pitch -= lookInput.y * cameraConfig.lookSensitivity * Time.deltaTime;
}
pitch = Mathf.Clamp(pitch, cameraConfig.bottomClampAngle, cameraConfig.topClampAngle);
playerController.SetCameraRotation(pitch, Yaw);
playerPawn.SetCameraRotation(pitch, Yaw);
}
public void Shoot(bool isShooting)
{
if (!isShooting) return;
if(GunWeapon.canAttack)
{
GunWeapon.Attack();
}
}

View File

@@ -8,11 +8,13 @@ namespace Darkmatter.Presentation
{
public class CameraService : MonoBehaviour, ICameraService
{
public Camera mainCamera { get; private set; }
public CinemachineThirdPersonFollow AdsCamera;
[Inject] private IInputReader inputReader;
public bool isAiming = false;
private void Start()
{
mainCamera = Camera.main;
inputReader.OnAdsCameraSwitch += SwitchADSCamera;
AdsCamera.gameObject.SetActive(false);
}

View File

@@ -1,30 +0,0 @@
using System;
using UnityEngine;
namespace Darkmatter.Presentation
{
public class Gun : MonoBehaviour
{
public LineRenderer lineRenderer;
public float LifeTime = 0.05f;
public void Init(Vector3 start, Vector3 end)
{
lineRenderer.enabled = true;
lineRenderer.SetPosition(0, start);
lineRenderer.SetPosition(1, end);
Invoke("DisableBullet", LifeTime);
}
void DisableBullet()
{
lineRenderer.enabled = false;
}
public void Shoot()
{
Debug.Log("Shooting");
}
}
}

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: c3f99ff473a5f474099e6dd5f8dcde78

View File

@@ -8,11 +8,11 @@ using VContainer;
namespace Darkmatter.Presentation
{
public class PlayerMotor : MonoBehaviour, IPlayerPawn, IAimProvider
public class PlayerMotor : MonoBehaviour, IPlayerPawn
{
public TwoBoneIKConstraint IKConstraint;
[Header("LookSetting")]
public Camera mainCamera { get; private set; }
public Transform cinemachineFollowTarget;
[Header("MoveSetting")]
@@ -22,8 +22,6 @@ namespace Darkmatter.Presentation
private float verticalVelocity;
public bool isGrounded => IsOnGround();
public Vector3 AimDir { get; set; }
[Header("GroundCheckSensorSetting")]
public float groundOffset;
public float groundCheckRadius;
@@ -31,115 +29,13 @@ namespace Darkmatter.Presentation
[Header("TurnSetting")]
public float turnSpeed = 5f;
public float smoothing = 10f;
[Header("AnimationSetting")]
public Animator animator;
[Header("AimSetting")]
public Transform aim;
Vector3 mouseWorldPos = Vector3.zero;
public Transform muzzlePos;
public float fireRate = 0.1f;
float nextFiretime=0;
public ParticleSystem muzzleFlashParticle;
public ParticleSystem bulletHitParticle;
public GameObject BulletHole;
[Inject] private IInputReader inputReader;
[Inject] private PlayerConfigSO playerConfig;
[Inject] private IWeapon gunWeapon;
private void Start()
{
Cursor.lockState = CursorLockMode.Locked;
if(animator==null) animator = GetComponent<Animator>();
mainCamera = Camera.main;
}
private void Update()
{
HandleAim();
HandleShooting();
}
private void LateUpdate()
{
}
public int bulletAmount = 40;
private void HandleShooting()
{
//float shootingWeight = animator.GetLayerWeight(1);
//float targetWeight = inputReader.isShooting ? 1 : 0;
//float setshootingWeight = Mathf.Lerp(shootingWeight, targetWeight, Time.deltaTime * 5);
//animator.SetLayerWeight(1, setshootingWeight);
//animator.SetBool("IsShooting", inputReader.isShooting);
if (!inputReader.isShooting) return;
//if(Time.time>=nextFiretime && bulletAmount > 0)
//{
// bulletAmount--;
// nextFiretime = Time.time + fireRate;
// Vector2 screenPoint = new Vector2(Screen.width / 2, Screen.height / 2);
// Ray ray = mainCamera.ScreenPointToRay(screenPoint);
// RaycastHit hit;
// Physics.Raycast(ray, out hit, 100f);
// if(hit.collider.GetComponent<IDamageable>() != null)
// {
// hit.collider.GetComponent<IDamageable>().TakeDamage(10f);
// }
// Vector3 spawnPos = hit.point + hit.normal * 0.01f;
// GameObject bulletHit = Instantiate(BulletHole, spawnPos, Quaternion.LookRotation(hit.normal));
// bulletHitParticle.transform.position = spawnPos;
// bulletHitParticle.transform.rotation = Quaternion.LookRotation(hit.normal);
// bulletHitParticle.Play(true);
// Destroy(bulletHit,5f);
// muzzleFlashParticle.Play(true);
// if(bulletAmount==0)
// {
// StartCoroutine(Reload());
// }
//}
gunWeapon.Attack();
}
IEnumerator Reload()
{
IKConstraint.weight = 0f;
animator.SetLayerWeight(1, 1);
animator.SetTrigger("Reload");
yield return new WaitForSeconds(3f);
bulletAmount =40;
animator.SetLayerWeight(1, 0);
IKConstraint.weight = 1;
}
private void HandleAim()
{
Vector2 screenPoint = new Vector2(Screen.width/2, Screen.height/2);
Ray ray = mainCamera.ScreenPointToRay(screenPoint);
if(Physics.Raycast(ray,out RaycastHit hitPoint, 100f,groundLayer))
{
mouseWorldPos= hitPoint.point;
//aim.position = mouseWorldPos;
aim.position = Vector3.Lerp(aim.position, hitPoint.point, Time.deltaTime * smoothing);
}
Vector3 aimDir = (mouseWorldPos - transform.position).normalized;
AimDir = aimDir;
aimDir.y = 0; //
Quaternion targetRot = Quaternion.LookRotation(aimDir);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRot, Time.deltaTime * turnSpeed);
}
}
//state based functions
public void Move(Vector3 motion)
@@ -153,8 +49,7 @@ namespace Darkmatter.Presentation
public void SetCameraRotation(float pitch, float yaw)
{
cinemachineFollowTarget.rotation = Quaternion.Euler(pitch, yaw, 0);
//transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0,yaw,0), Time.deltaTime*turnSpeed);
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0,yaw,0), Time.deltaTime*turnSpeed); //rotate player towards the camera forward axis
}
public void Jump(float jumpForce)

View File

@@ -0,0 +1,41 @@
using Darkmatter.Core;
using UnityEngine;
namespace Darkmatter.Presentation
{
public class TargetProvider : MonoBehaviour, ITargetProvider
{
private Camera mainCamera;
[SerializeField] private LayerMask aimLayer;
private RaycastHit _hitPoint;
public RaycastHit hitPoint => _hitPoint;
public Vector3 currentAimPos;
public Transform AimObject; //for IK aim handling
public float smoothing = 10f;
public float maxDistance = 100f;
private void Start()
{
mainCamera = Camera.main;
}
private void Update()
{
Vector2 screenPoint = new Vector2(Screen.width / 2, Screen.height / 2);
Ray ray = mainCamera.ScreenPointToRay(screenPoint);
if (Physics.Raycast(ray, out _hitPoint, maxDistance, aimLayer,queryTriggerInteraction:QueryTriggerInteraction.Ignore))
{
currentAimPos = Vector3.Lerp(currentAimPos, _hitPoint.point, Time.deltaTime * smoothing);
}
else
{
currentAimPos = ray.GetPoint(maxDistance);
}
AimObject.position = currentAimPos;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 315b8f05ac753ce4cb4b05beec2a6f9f

View File

@@ -1,5 +1,6 @@
using Darkmatter.Core;
using Darkmatter.Domain;
using System;
using UnityEngine;
using VContainer;
@@ -12,15 +13,17 @@ namespace Darkmatter.Presentation
public ParticleSystem BulletHitEffectParticle;
[Header("Weapon Data")]
public float fireRate = 1f;
public float fireRate = 0.1f;
public int ammoCount = 40;
private float lastUsedTime;
public GameObject BulletHole;
public override string WeaponName => "Rifel";
public override bool canAttack => Time.time >= lastUsedTime + fireRate;
public override bool canAttack => Time.time >= lastUsedTime + fireRate && ammoCount > 0;
[Inject] private IAimProvider aimProvider;
[Inject] private ITargetProvider targetProvider;
private RaycastHit hitPoint => targetProvider.hitPoint;
@@ -28,18 +31,38 @@ namespace Darkmatter.Presentation
{
lastUsedTime = Time.time;
ammoCount--;
PlayMuzzleFlash();
if (hitPoint.transform != null) PlayBulletHitEffectParticle();
Vector3 startPos = transform.position;
Vector3 direction = aimProvider.AimDir;
Debug.Log("Attack using Gun");
//use ray cast here
//after ray cast use damage logic too
if(ammoCount <= 0) //test reload
{
Reload();
}
}
private void ShowBulletHole(Vector3 spawnPos)
{
GameObject bulletHit = Instantiate(BulletHole, spawnPos, Quaternion.LookRotation(hitPoint.normal));
Destroy(bulletHit, 5f);
}
private void PlayBulletHitEffectParticle()
{
var damageable = hitPoint.transform.GetComponent<IDamageable>();
if (damageable != null)
{
damageable.TakeDamage(10f);
}
Vector3 spawnPos = hitPoint.point + hitPoint.normal * 0.01f;
BulletHitEffectParticle.transform.position = spawnPos;
BulletHitEffectParticle.transform.rotation = Quaternion.LookRotation(hitPoint.normal);
BulletHitEffectParticle.Play(true);
}
public override void Reload()
{
base.Reload();