Files
Robii Aragon fd87a6ffd5 add ckg
plantilla base para movimiento básico
2026-02-05 05:07:55 -08:00

590 lines
16 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class weaponBuilder : MonoBehaviour
{
public string weaponName;
public string relativePathUsableWeaponPrefab = "";
public GameObject usableWeaponPrefab;
public LayerMask layerToPlaceWeaponPrefab;
public playerWeaponsManager mainPlayerWeaponsManager;
public IKWeaponSystem mainIKWeaponSystem;
public playerWeaponSystem mainPlayerWeaponSystem;
public Transform weaponParent;
public GameObject weaponMeshParent;
public Transform newWeaponMeshParent;
public Transform weaponViewTransform;
public bool replaceArmsModel;
public Transform armsParent;
public GameObject currentArmsModel;
public GameObject newArmsModel;
public List<partInfo> weaponPartInfoList = new List<partInfo> ();
public List<settingsInfo> weaponSettingsInfoList = new List<settingsInfo> ();
public List<GameObject> weaponPartsNotUsedOnAIList = new List<GameObject> ();
public List<Transform> weaponPartsToMoveToNewParentList = new List<Transform> ();
public bool showGizmo;
public bool showGizmoLabel;
public Color gizmoLabelColor = Color.black;
public float gizmoRadius;
public bool useHandle;
[TextArea (3, 10)] public string buildWeaponExplanation = "Make sure to drop the prefab of the model for the new weapon you want to create" +
" in the scene window and assign the parts of that object into the editor.";
partInfo currentWeaponPartInfo;
settingsInfo currentWeaponSettingsInfo;
public bool createWeaponInventoryActive;
public bool createWeaponAmmoInventoryActive;
public bool createUsableWeaponPrefabActive;
public int weaponAmmoAmountValue = 10;
string previousWeaponName;
Texture weaponIconTexture;
string weaponDescription;
float objectWeight;
bool canBeSold = true;
float vendorPrice = 1000;
float sellPrice = 500;
GameObject customAmmoMesh;
Texture customAmmoIcon;
string customAmmoDescription;
bool useDurability;
float durabilityAmount;
float maxDurabilityAmount;
float durabilityUsedOnAttack;
public void buildWeapon ()
{
moveWeaponPartsToMoveToNewParent ();
adjustWeaponParts ();
checkArmsToReplace ();
resetTemporalWeaponParts ();
adjustWeaponSettings ();
completeWeaponBuild ();
checkIfCreateInventoryWeapon ();
checkIfCreateInventoryWeaponAmmo ();
checkCreateUsableWeaponPrefab ();
checkRemoteRegularWeaponPickupPrefab ();
GKC_Utils.setActiveGameObjectInEditor (gameObject);
alignViewWithWeaponCameraPosition ();
updateComponent ();
}
void moveWeaponPartsToMoveToNewParent ()
{
if (weaponPartsToMoveToNewParentList.Count == 0) {
return;
}
for (int i = 0; i < weaponPartsToMoveToNewParentList.Count; i++) {
if (weaponPartsToMoveToNewParentList [i] != null) {
weaponPartsToMoveToNewParentList [i].SetParent (newWeaponMeshParent);
}
}
}
public void adjustWeaponParts ()
{
for (int i = 0; i < weaponPartInfoList.Count; i++) {
currentWeaponPartInfo = weaponPartInfoList [i];
if (currentWeaponPartInfo.containsIKTransform) {
for (int j = 0; j < currentWeaponPartInfo.IKPositionsListOnMesh.Count; j++) {
currentWeaponPartInfo.IKPositionsListOnMesh [j].SetParent (weaponMeshParent.transform);
}
}
if (!currentWeaponPartInfo.removeWeaponPartIfNoNewMesh) {
if (currentWeaponPartInfo.newWeaponMesh != null) {
if (currentWeaponPartInfo.currentWeaponMesh != null) {
DestroyImmediate (currentWeaponPartInfo.currentWeaponMesh);
}
for (int j = 0; j < currentWeaponPartInfo.extraWeaponPartMeshesList.Count; j++) {
DestroyImmediate (currentWeaponPartInfo.extraWeaponPartMeshesList [j]);
}
currentWeaponPartInfo.extraWeaponPartMeshesList.Clear ();
if (currentWeaponPartInfo.temporalWeaponMeshInstantiated) {
currentWeaponPartInfo.currentWeaponMesh = currentWeaponPartInfo.temporalWeaponMesh;
} else {
GameObject newWeaponPart = (GameObject)Instantiate (currentWeaponPartInfo.newWeaponMesh, Vector3.zero, Quaternion.identity);
Transform newWeaponPartTransform = newWeaponPart.transform;
newWeaponPartTransform.SetParent (currentWeaponPartInfo.weaponMeshParent);
newWeaponPartTransform.localPosition = Vector3.zero;
newWeaponPartTransform.localRotation = Quaternion.identity;
currentWeaponPartInfo.currentWeaponMesh = newWeaponPart;
}
if (currentWeaponPartInfo.containsIKTransform) {
for (int j = 0; j < currentWeaponPartInfo.IKPositionsListOnMesh.Count; j++) {
currentWeaponPartInfo.IKPositionsListOnMesh [j].SetParent (currentWeaponPartInfo.currentWeaponMesh.transform);
}
}
}
} else {
DestroyImmediate (currentWeaponPartInfo.currentWeaponMesh);
for (int j = 0; j < currentWeaponPartInfo.extraWeaponPartMeshesList.Count; j++) {
DestroyImmediate (currentWeaponPartInfo.extraWeaponPartMeshesList [j]);
}
currentWeaponPartInfo.extraWeaponPartMeshesList.Clear ();
}
currentWeaponPartInfo.newWeaponMesh = null;
if (!currentWeaponPartInfo.removeWeaponPartIfNoNewMesh) {
if (currentWeaponPartInfo.useEventOnUseWeaponPartEnabled) {
currentWeaponPartInfo.eventOnUseWeaponPartEnabled.Invoke ();
}
} else {
if (currentWeaponPartInfo.useEventOnUseWeaponPartDisabled) {
currentWeaponPartInfo.eventOnUseWeaponPartDisabled.Invoke ();
}
}
}
}
public void checkArmsToReplace ()
{
if (replaceArmsModel) {
if (newArmsModel != null) {
GameObject newArmsGameObject = (GameObject)Instantiate (newArmsModel, Vector3.zero, Quaternion.identity);
Transform newArmsTransform = newArmsGameObject.transform;
// newArmsTransform.SetParent (armsParent);
newArmsTransform.SetParent (weaponMeshParent.transform);
newArmsTransform.localPosition = Vector3.zero;
newArmsTransform.localRotation = Quaternion.identity;
if (currentArmsModel != null) {
DestroyImmediate (currentArmsModel);
}
currentArmsModel = newArmsGameObject;
mainIKWeaponSystem.setNewFirstPersonArms (currentArmsModel);
replaceArmsModel = false;
newArmsModel = null;
mainPlayerWeaponsManager.setWeaponPartLayerFromCameraView (currentArmsModel, true);
} else {
print ("WARNING: no new arms were found, please, drop an arms model into the new arms field to assign it");
}
}
}
public void toogleArmsMeshActiveState ()
{
if (currentArmsModel != null) {
currentArmsModel.SetActive (!currentArmsModel.activeSelf);
}
}
public void adjustWeaponSettings ()
{
for (int i = 0; i < weaponSettingsInfoList.Count; i++) {
currentWeaponSettingsInfo = weaponSettingsInfoList [i];
if (currentWeaponSettingsInfo.useBoolState) {
currentWeaponSettingsInfo.eventToSetBoolState.Invoke (currentWeaponSettingsInfo.boolState);
}
if (currentWeaponSettingsInfo.useFloatValue) {
currentWeaponSettingsInfo.eventToSetFloatValue.Invoke (currentWeaponSettingsInfo.floatValue);
}
}
}
public void checkIfCreateInventoryWeapon ()
{
if (createWeaponInventoryActive) {
print ("\n");
print ("Create inventory weapon\n\n");
mainIKWeaponSystem.createInventoryWeaponExternally (weaponName, weaponDescription, weaponIconTexture,
useDurability, durabilityAmount, maxDurabilityAmount, durabilityUsedOnAttack, objectWeight, canBeSold, vendorPrice, sellPrice);
}
}
public void setCustomAmmoMeshInfo (GameObject newCustomAmmoMesh, Texture newCustomAmmoIcon, string newCustomAmmoDescription)
{
customAmmoMesh = newCustomAmmoMesh;
customAmmoIcon = newCustomAmmoIcon;
customAmmoDescription = newCustomAmmoDescription;
}
public void checkIfCreateInventoryWeaponAmmo ()
{
if (createWeaponAmmoInventoryActive) {
mainIKWeaponSystem.createInventoryWeaponAmmoExternally ((weaponName + " Ammo"), weaponAmmoAmountValue,
customAmmoMesh, customAmmoIcon, customAmmoDescription);
}
}
public void checkCreateUsableWeaponPrefab ()
{
if (createUsableWeaponPrefabActive) {
createUsableWeaponPrefab ();
} else {
usableWeaponPrefab = null;
}
}
public void checkRemoteRegularWeaponPickupPrefab ()
{
mainIKWeaponSystem.removeWeaponRegularPickup ();
}
public void adjustWeaponSettingsFromEditor ()
{
adjustWeaponSettings ();
GKC_Utils.updateDirtyScene ("Updating Weapon Builder Content", gameObject);
}
public void completeWeaponBuild ()
{
mainPlayerWeaponSystem.setWeaponSystemName (weaponName);
gameObject.name = weaponName;
if (mainPlayerWeaponsManager != null) {
mainPlayerWeaponsManager.setWeaponList ();
mainPlayerWeaponsManager.addWeaponToSamePocket (weaponName, previousWeaponName);
mainPlayerWeaponsManager.setWeaponPartLayerFromCameraView (weaponMeshParent, mainPlayerWeaponsManager.isFirstPersonActive ());
}
print ("New Weapon Built: " + mainPlayerWeaponSystem.getWeaponSystemName ());
}
public void resetTemporalWeaponParts ()
{
for (int i = 0; i < weaponPartInfoList.Count; i++) {
currentWeaponPartInfo = weaponPartInfoList [i];
currentWeaponPartInfo.temporalWeaponMesh = null;
currentWeaponPartInfo.temporalWeaponMeshInstantiated = false;
currentWeaponPartInfo.temporalNewWeaponMesh = null;
currentWeaponPartInfo.newWeaponMeshPositionOffset = Vector3.zero;
currentWeaponPartInfo.newWeaponMeshEulerOffset = Vector3.zero;
}
}
public void removeTemporalWeaponParts ()
{
for (int i = 0; i < weaponPartInfoList.Count; i++) {
currentWeaponPartInfo = weaponPartInfoList [i];
if (currentWeaponPartInfo.temporalWeaponMeshInstantiated) {
DestroyImmediate (currentWeaponPartInfo.temporalWeaponMesh);
currentWeaponPartInfo.temporalWeaponMesh = null;
currentWeaponPartInfo.temporalNewWeaponMesh = null;
}
currentWeaponPartInfo.temporalWeaponMeshInstantiated = false;
currentWeaponPartInfo.newWeaponMeshPositionOffset = Vector3.zero;
currentWeaponPartInfo.newWeaponMeshEulerOffset = Vector3.zero;
if (currentWeaponPartInfo.currentWeaponMesh != null) {
currentWeaponPartInfo.currentWeaponMesh.SetActive (true);
}
currentWeaponPartInfo.newWeaponMesh = null;
currentWeaponPartInfo.removeWeaponPartIfNoNewMesh = false;
if (currentWeaponPartInfo.currentWeaponMesh != null) {
currentWeaponPartInfo.currentWeaponMesh.SetActive (true);
}
for (int j = 0; j < currentWeaponPartInfo.extraWeaponPartMeshesList.Count; j++) {
if (currentWeaponPartInfo.extraWeaponPartMeshesList [j] != null) {
currentWeaponPartInfo.extraWeaponPartMeshesList [j].SetActive (true);
}
}
}
}
public void setCreateWeaponInventoryActiveState (bool state)
{
createWeaponInventoryActive = state;
updateComponent ();
}
public void setCreateWeaponAmmoInventoryActiveState (bool state)
{
createWeaponAmmoInventoryActive = state;
updateComponent ();
}
public void setWeaponAmmoAmountValue (float ammoAmount)
{
weaponAmmoAmountValue = (int)ammoAmount;
updateComponent ();
}
public void setCreateUsableWeaponPrefabActiveState (bool state)
{
createUsableWeaponPrefabActive = state;
updateComponent ();
}
public void alignViewWithWeaponCameraPosition ()
{
setEditorCameraPosition (weaponViewTransform);
}
public void setEditorCameraPosition (Transform transformToUse)
{
GKC_Utils.alignViewToObject (transformToUse);
}
public void setNewWeaponName (string newWeaponName)
{
previousWeaponName = weaponName;
weaponName = newWeaponName;
updateComponent ();
}
public void setNewWeaponIconTexture (Texture newWeaponIconTexture)
{
weaponIconTexture = newWeaponIconTexture;
}
public void setNewWeaponDescription (string newValue)
{
weaponDescription = newValue;
}
public void setObjectWeight (float newValue)
{
objectWeight = newValue;
}
public void setCanBeSold (bool newValue)
{
canBeSold = newValue;
}
public void setvendorPrice (float newValue)
{
vendorPrice = newValue;
}
public void setSellPrice (float newValue)
{
sellPrice = newValue;
}
public void setWeaponInventorySlotIconInEditor (Texture newTexture)
{
mainPlayerWeaponSystem.setWeaponInventorySlotIconInEditor (newTexture);
}
public void setWeaponIconHUDInEditor (Texture newTexture)
{
mainPlayerWeaponSystem.setWeaponIconHUDInEditor (newTexture);
}
public void setWeaponIconInEditor (Texture newTexture)
{
mainPlayerWeaponSystem.setWeaponIconInEditor (newTexture);
}
public void setWeaponDurabilityInfo (bool useDurabilityValue, float durabilityAmountValue, float maxDurabilityAmountValue, float durabilityUsedOnAttackValue)
{
useDurability = useDurabilityValue;
durabilityAmount = durabilityAmountValue;
maxDurabilityAmount = maxDurabilityAmountValue;
durabilityUsedOnAttack = durabilityUsedOnAttackValue;
}
public void checkWeaponBuilder (playerWeaponsManager newPlayerWeaponsManager)
{
if (newPlayerWeaponsManager != null) {
mainPlayerWeaponsManager = newPlayerWeaponsManager;
weaponParent = mainPlayerWeaponsManager.getWeaponsParent ();
updateComponent ();
}
}
public void checkWeaponsPartsToRemoveOnAI ()
{
for (int i = 0; i < weaponPartsNotUsedOnAIList.Count; i++) {
if (weaponPartsNotUsedOnAIList [i] != null) {
DestroyImmediate (weaponPartsNotUsedOnAIList [i]);
}
}
weaponPartsNotUsedOnAIList.Clear ();
updateComponent ();
}
public void createUsableWeaponPrefab ()
{
relativePathUsableWeaponPrefab = pathInfoValues.getUsableWeaponsPrefabsPath ();
usableWeaponPrefab = GKC_Utils.createPrefab (relativePathUsableWeaponPrefab, weaponName, gameObject);
updateComponent ();
GKC_Utils.updateDirtyScene ("Updating Weapon Builder Content", gameObject);
}
public void instantiateUsableWeaponPrefabInScene ()
{
relativePathUsableWeaponPrefab = pathInfoValues.getUsableWeaponsPrefabsPath ();
GKC_Utils.instantiatePrefabInScene (relativePathUsableWeaponPrefab, weaponName, layerToPlaceWeaponPrefab);
GKC_Utils.updateDirtyScene ("Updating Weapon Builder Content", gameObject);
}
void updateComponent ()
{
GKC_Utils.updateComponent (this);
}
#if UNITY_EDITOR
void OnDrawGizmos ()
{
if (!showGizmo) {
return;
}
if (GKC_Utils.isCurrentSelectionActiveGameObject (gameObject)) {
DrawGizmos ();
}
}
void OnDrawGizmosSelected ()
{
DrawGizmos ();
}
void DrawGizmos ()
{
if (showGizmo) {
for (int i = 0; i < weaponPartInfoList.Count; i++) {
if (weaponPartInfoList [i].objectAlwaysUsed && weaponPartInfoList [i].currentWeaponMesh != null) {
Gizmos.color = Color.yellow;
Gizmos.DrawSphere (weaponPartInfoList [i].currentWeaponMesh.transform.position, gizmoRadius);
}
}
}
}
#endif
[System.Serializable]
public class settingsInfo
{
public string Name;
public bool useBoolState;
public bool boolState;
public eventParameters.eventToCallWithBool eventToSetBoolState;
public bool useFloatValue;
public float floatValue;
public eventParameters.eventToCallWithAmount eventToSetFloatValue;
public bool expandElement;
}
[System.Serializable]
public class partInfo
{
public string Name;
public bool removeWeaponPartIfNoNewMesh;
public Transform weaponMeshParent;
public GameObject currentWeaponMesh;
public GameObject newWeaponMesh;
public bool objectAlwaysUsed;
public List<GameObject> extraWeaponPartMeshesList = new List<GameObject> ();
public bool containsIKTransform;
public List<Transform> IKPositionsListOnMesh = new List<Transform> ();
public bool temporalWeaponMeshInstantiated;
public GameObject temporalWeaponMesh;
public GameObject temporalNewWeaponMesh;
public bool useEventOnUseWeaponPartEnabled;
public UnityEvent eventOnUseWeaponPartEnabled;
public bool useEventOnUseWeaponPartDisabled;
public UnityEvent eventOnUseWeaponPartDisabled;
public Vector3 newWeaponMeshPositionOffset;
public Vector3 newWeaponMeshEulerOffset;
public bool expandElement;
}
}