added inventory and stamina system
This commit is contained in:
151
Assets/Scripts/Editor/GunSplatSetup.cs
Normal file
151
Assets/Scripts/Editor/GunSplatSetup.cs
Normal file
@@ -0,0 +1,151 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.IO;
|
||||
|
||||
/// <summary>
|
||||
/// OGG → Setup → Create Gun Splat Weapon
|
||||
/// Builds:
|
||||
/// • Assets/Prefabs/Weapons/GunSplat.prefab — the held weapon (SimpleGun)
|
||||
/// • Assets/Prefabs/Pickups/GunSplat_Pickup.prefab — world pickup (spins/bobs, press E)
|
||||
/// • Assets/Items/GunSplat_Item.asset — ItemDefinition (type = Weapon)
|
||||
/// </summary>
|
||||
public static class GunSplatSetup
|
||||
{
|
||||
private const string GLB_PATH = "Assets/Models/LidarScans/Gun Splat.glb";
|
||||
private const string WEAPON_PREFAB = "Assets/Prefabs/Weapons/GunSplat.prefab";
|
||||
private const string PICKUP_PREFAB = "Assets/Prefabs/Pickups/GunSplat_Pickup.prefab";
|
||||
private const string ITEM_DEF_PATH = "Assets/Items/GunSplat_Item.asset";
|
||||
|
||||
[MenuItem("OGG/Setup/Create Gun Splat Weapon")]
|
||||
public static void CreateGunSplat()
|
||||
{
|
||||
// ── 1. Ensure output folders exist ──────────────────────────
|
||||
EnsureFolder("Assets/Prefabs/Weapons");
|
||||
EnsureFolder("Assets/Prefabs/Pickups");
|
||||
EnsureFolder("Assets/Items");
|
||||
|
||||
// ── 2. Load the GLB model ────────────────────────────────────
|
||||
GameObject modelAsset = AssetDatabase.LoadAssetAtPath<GameObject>(GLB_PATH);
|
||||
if (modelAsset == null)
|
||||
{
|
||||
Debug.LogError($"[GunSplatSetup] Could not find GLB at: {GLB_PATH}");
|
||||
EditorUtility.DisplayDialog("Gun Splat Setup", $"Could not find model at:\n{GLB_PATH}", "OK");
|
||||
return;
|
||||
}
|
||||
|
||||
// ── 3. Build the held-weapon prefab ──────────────────────────
|
||||
GameObject weaponRoot = new GameObject("GunSplat");
|
||||
AttachVisual(weaponRoot, modelAsset);
|
||||
|
||||
SimpleGun gun = weaponRoot.AddComponent<SimpleGun>();
|
||||
gun.damage = 30f;
|
||||
gun.range = 120f;
|
||||
gun.fireRate = 6f;
|
||||
gun.maxAmmo = 24;
|
||||
gun.isAutomatic = false;
|
||||
|
||||
if (File.Exists(DataRelative(WEAPON_PREFAB)))
|
||||
AssetDatabase.DeleteAsset(WEAPON_PREFAB);
|
||||
|
||||
GameObject savedWeapon = PrefabUtility.SaveAsPrefabAsset(weaponRoot, WEAPON_PREFAB);
|
||||
Object.DestroyImmediate(weaponRoot);
|
||||
|
||||
if (savedWeapon == null)
|
||||
{
|
||||
Debug.LogError("[GunSplatSetup] Failed to save weapon prefab.");
|
||||
return;
|
||||
}
|
||||
Debug.Log($"[GunSplatSetup] Weapon prefab → {WEAPON_PREFAB}");
|
||||
|
||||
// ── 4. Create / update ItemDefinition ────────────────────────
|
||||
ItemDefinition item = AssetDatabase.LoadAssetAtPath<ItemDefinition>(ITEM_DEF_PATH);
|
||||
bool isNew = item == null;
|
||||
if (isNew) item = ScriptableObject.CreateInstance<ItemDefinition>();
|
||||
|
||||
item.itemName = "Gun Splat";
|
||||
item.type = ItemDefinition.ItemType.Weapon;
|
||||
item.weaponPrefab = savedWeapon;
|
||||
item.description = "A janky lidar-scanned sidearm. Shoots first, looks weird always.";
|
||||
|
||||
if (isNew)
|
||||
AssetDatabase.CreateAsset(item, ITEM_DEF_PATH);
|
||||
else
|
||||
EditorUtility.SetDirty(item);
|
||||
|
||||
AssetDatabase.SaveAssets();
|
||||
Debug.Log($"[GunSplatSetup] ItemDefinition → {ITEM_DEF_PATH}");
|
||||
|
||||
// ── 5. Build the world pickup prefab ─────────────────────────
|
||||
GameObject pickupRoot = new GameObject("GunSplat_Pickup");
|
||||
|
||||
// Visual child — the GLB model
|
||||
AttachVisual(pickupRoot, modelAsset);
|
||||
|
||||
// PickupItem component
|
||||
PickupItem pickup = pickupRoot.AddComponent<PickupItem>();
|
||||
pickup.definition = item;
|
||||
pickup.spinSpeed = 90f;
|
||||
pickup.bobHeight = 0.15f;
|
||||
pickup.bobSpeed = 2.0f;
|
||||
pickup.pickupRadius = 2.2f;
|
||||
pickup.pickupKey = KeyCode.E;
|
||||
|
||||
if (File.Exists(DataRelative(PICKUP_PREFAB)))
|
||||
AssetDatabase.DeleteAsset(PICKUP_PREFAB);
|
||||
|
||||
GameObject savedPickup = PrefabUtility.SaveAsPrefabAsset(pickupRoot, PICKUP_PREFAB);
|
||||
Object.DestroyImmediate(pickupRoot);
|
||||
|
||||
if (savedPickup == null)
|
||||
{
|
||||
Debug.LogError("[GunSplatSetup] Failed to save pickup prefab.");
|
||||
return;
|
||||
}
|
||||
Debug.Log($"[GunSplatSetup] Pickup prefab → {PICKUP_PREFAB}");
|
||||
|
||||
AssetDatabase.Refresh();
|
||||
|
||||
// ── 6. Done ──────────────────────────────────────────────────
|
||||
EditorUtility.DisplayDialog(
|
||||
"Gun Splat Setup ✓",
|
||||
"Created:\n" +
|
||||
$"• {WEAPON_PREFAB}\n" +
|
||||
$"• {PICKUP_PREFAB}\n" +
|
||||
$"• {ITEM_DEF_PATH}\n\n" +
|
||||
"Drag GunSplat_Pickup into the scene wherever you want it to spawn.\n" +
|
||||
"It will spin, bob, and show an [E] prompt when the player gets close.",
|
||||
"Sick");
|
||||
|
||||
EditorGUIUtility.PingObject(savedPickup);
|
||||
Selection.activeObject = savedPickup;
|
||||
}
|
||||
|
||||
// ─── Helpers ─────────────────────────────────────────────────────
|
||||
|
||||
static void AttachVisual(GameObject parent, GameObject modelAsset)
|
||||
{
|
||||
GameObject visual = (GameObject)PrefabUtility.InstantiatePrefab(modelAsset);
|
||||
if (visual == null) visual = Object.Instantiate(modelAsset);
|
||||
visual.name = "Visual";
|
||||
visual.transform.SetParent(parent.transform, false);
|
||||
visual.transform.localPosition = Vector3.zero;
|
||||
visual.transform.localRotation = Quaternion.identity;
|
||||
visual.transform.localScale = Vector3.one;
|
||||
}
|
||||
|
||||
static string DataRelative(string assetPath) =>
|
||||
Application.dataPath + "/../" + assetPath;
|
||||
|
||||
static void EnsureFolder(string path)
|
||||
{
|
||||
string[] parts = path.Split('/');
|
||||
string current = parts[0];
|
||||
for (int i = 1; i < parts.Length; i++)
|
||||
{
|
||||
string next = current + "/" + parts[i];
|
||||
if (!AssetDatabase.IsValidFolder(next))
|
||||
AssetDatabase.CreateFolder(current, parts[i]);
|
||||
current = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user