128 lines
3.8 KiB
C#
128 lines
3.8 KiB
C#
using UnityEngine;
|
|
|
|
public class SimpleGun : MonoBehaviour
|
|
{
|
|
[Header("Gun Settings")]
|
|
public float damage = 25f;
|
|
public float range = 100f;
|
|
public float fireRate = 0.5f;
|
|
public int maxAmmo = 30;
|
|
public int currentAmmo;
|
|
|
|
[Header("References")]
|
|
public Camera fpsCam;
|
|
public ParticleSystem muzzleFlash;
|
|
|
|
private float nextTimeToFire = 0f;
|
|
|
|
void Start()
|
|
{
|
|
currentAmmo = maxAmmo;
|
|
|
|
// Find camera if not assigned
|
|
if (fpsCam == null)
|
|
{
|
|
fpsCam = Camera.main;
|
|
}
|
|
|
|
// Create simple gun visuals
|
|
CreateSimpleGunModel();
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
// Shoot on left mouse button
|
|
if (Input.GetButton("Fire1") && Time.time >= nextTimeToFire)
|
|
{
|
|
nextTimeToFire = Time.time + 1f / fireRate;
|
|
Shoot();
|
|
}
|
|
|
|
// Reload on R key
|
|
if (Input.GetKeyDown(KeyCode.R))
|
|
{
|
|
Reload();
|
|
}
|
|
}
|
|
|
|
void CreateSimpleGunModel()
|
|
{
|
|
// Main body
|
|
GameObject body = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
|
body.transform.SetParent(transform);
|
|
body.transform.localPosition = new Vector3(0, -0.1f, 0.3f);
|
|
body.transform.localScale = new Vector3(0.1f, 0.15f, 0.4f);
|
|
body.transform.localRotation = Quaternion.identity;
|
|
Destroy(body.GetComponent<Collider>()); // Remove collider
|
|
|
|
// Set color
|
|
Renderer bodyRenderer = body.GetComponent<Renderer>();
|
|
bodyRenderer.material.color = new Color(0.2f, 0.2f, 0.2f); // Dark gray
|
|
|
|
// Barrel
|
|
GameObject barrel = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
|
|
barrel.transform.SetParent(transform);
|
|
barrel.transform.localPosition = new Vector3(0, -0.05f, 0.6f);
|
|
barrel.transform.localScale = new Vector3(0.03f, 0.15f, 0.03f);
|
|
barrel.transform.localRotation = Quaternion.Euler(90, 0, 0);
|
|
Destroy(barrel.GetComponent<Collider>());
|
|
|
|
Renderer barrelRenderer = barrel.GetComponent<Renderer>();
|
|
barrelRenderer.material.color = new Color(0.1f, 0.1f, 0.1f); // Even darker
|
|
|
|
// Handle
|
|
GameObject handle = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
|
handle.transform.SetParent(transform);
|
|
handle.transform.localPosition = new Vector3(0, -0.25f, 0.15f);
|
|
handle.transform.localScale = new Vector3(0.08f, 0.2f, 0.1f);
|
|
handle.transform.localRotation = Quaternion.Euler(15, 0, 0);
|
|
Destroy(handle.GetComponent<Collider>());
|
|
|
|
Renderer handleRenderer = handle.GetComponent<Renderer>();
|
|
handleRenderer.material.color = new Color(0.3f, 0.2f, 0.1f); // Brown
|
|
}
|
|
|
|
void Shoot()
|
|
{
|
|
if (currentAmmo <= 0)
|
|
{
|
|
Debug.Log("Out of ammo! Press R to reload.");
|
|
return;
|
|
}
|
|
|
|
currentAmmo--;
|
|
Debug.Log($"Shot fired! Ammo: {currentAmmo}/{maxAmmo}");
|
|
|
|
// Play muzzle flash if assigned
|
|
if (muzzleFlash != null)
|
|
{
|
|
muzzleFlash.Play();
|
|
}
|
|
|
|
// Raycast from camera center
|
|
RaycastHit hit;
|
|
if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
|
|
{
|
|
Debug.Log($"Hit: {hit.transform.name}");
|
|
|
|
// You can add hit detection for enemies here later
|
|
// Example: hit.transform.GetComponent<Enemy>()?.TakeDamage(damage);
|
|
}
|
|
}
|
|
|
|
void Reload()
|
|
{
|
|
Debug.Log("Reloading...");
|
|
currentAmmo = maxAmmo;
|
|
}
|
|
|
|
void OnGUI()
|
|
{
|
|
// Simple ammo counter in bottom-right
|
|
GUI.color = Color.white;
|
|
GUI.Label(new Rect(Screen.width - 120, Screen.height - 40, 100, 30),
|
|
$"Ammo: {currentAmmo}/{maxAmmo}",
|
|
new GUIStyle() { fontSize = 20, normal = new GUIStyleState() { textColor = Color.white } });
|
|
}
|
|
}
|