Assemblied created

This commit is contained in:
2023-06-02 00:30:58 -04:00
parent 3e1b55b036
commit 63039dbde2
99 changed files with 8302 additions and 1065 deletions

View File

@ -1,13 +1,16 @@
using UnityEngine;
[RequireComponent(typeof(Collider))]
[RequireComponent(typeof(Rigidbody))]
public abstract class CarryableItem : MonoBehaviour
namespace Item
{
[SerializeField] private string itemName;
[RequireComponent(typeof(Collider))]
[RequireComponent(typeof(Rigidbody))]
public abstract class CarryableItem : MonoBehaviour
{
[SerializeField] private string itemName;
[SerializeField] private int itemSize = 1;
[SerializeField] private int itemSize = 1;
public string ItemName => itemName;
public int ItemSize => itemSize;
}
public string ItemName => itemName;
public int ItemSize => itemSize;
}
}

View File

@ -1,96 +1,98 @@
using UnityEngine;
public class DoorInteractable : HeavyItemReceiver
namespace Item
{
[SerializeField] private Transform powerCoreCenter;
[SerializeField] private float minAttractDist = 5;
[SerializeField] private string nameSearched = "Power Core";
[SerializeField] private Animator[] anims;
private HeavyInteractableItem insertedCore;
private Vector3 priorLocalPos;
private Vector3 priorLocalRot;
private Vector3 priorScale;
public bool Powered => insertedCore != null;
// Start is called before the first frame update
private void Start()
public class DoorInteractable : HeavyItemReceiver
{
}
[SerializeField] private Transform powerCoreCenter;
// Update is called once per frame
private void Update()
{
foreach (var anim in anims) anim.SetBool("IsPowered", Powered);
}
[SerializeField] private float minAttractDist = 5;
public override bool Interact()
{
//print("INTERACTED!");
if (insertedCore == null)
[SerializeField] private string nameSearched = "Power Core";
[SerializeField] private Animator[] anims;
private HeavyInteractableItem insertedCore;
private Vector3 priorLocalPos;
private Vector3 priorLocalRot;
private Vector3 priorScale;
public bool Powered => insertedCore != null;
// Start is called before the first frame update
private void Start()
{
var worldHeavyItems = FindObjectsOfType<HeavyInteractableItem>();
//print("Found:" + worldHeavyItems.Length);
for (var i = 0; i < worldHeavyItems.Length; i++)
{
var item = worldHeavyItems[i];
}
if (!item.ItemName.Contains(nameSearched)) continue;
var dist = Vector3.Distance(item.transform.position, powerCoreCenter.transform.position);
//print("DIST:" + dist);
if (dist <= minAttractDist)
// Update is called once per frame
private void Update()
{
foreach (var anim in anims) anim.SetBool("IsPowered", Powered);
}
public override bool Interact()
{
//print("INTERACTED!");
if (insertedCore == null)
{
var worldHeavyItems = FindObjectsOfType<HeavyInteractableItem>();
//print("Found:" + worldHeavyItems.Length);
for (var i = 0; i < worldHeavyItems.Length; i++)
{
var _i = Player.PlayerInteractionHandler.instance.Inventory;
Interact(ref _i, ref item);
return true;
var item = worldHeavyItems[i];
if (!item.ItemName.Contains(nameSearched)) continue;
var dist = Vector3.Distance(item.transform.position, powerCoreCenter.transform.position);
//print("DIST:" + dist);
if (dist <= minAttractDist)
{
var _i = Player.PlayerInteractionHandler.instance.Inventory;
Interact(ref _i, ref item);
return true;
}
}
}
return false;
}
return false;
}
public override bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent)
{
//print("INTERACTED 2");
// print(heavyInvent);
if (heavyInvent != null && heavyInvent.ItemName.Contains(nameSearched))
public override bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent)
{
//print("DOOR OPEN!");
heavyInvent.GetComponent<Rigidbody>().isKinematic = true;
//print("INTERACTED 2");
// print(heavyInvent);
heavyInvent.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
priorLocalPos = heavyInvent.transform.localPosition;
priorLocalRot = heavyInvent.transform.localEulerAngles;
priorScale = heavyInvent.transform.localScale;
if (heavyInvent != null && heavyInvent.ItemName.Contains(nameSearched))
{
//print("DOOR OPEN!");
heavyInvent.GetComponent<Rigidbody>().isKinematic = true;
heavyInvent.transform.parent = powerCoreCenter;
heavyInvent.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
priorLocalPos = heavyInvent.transform.localPosition;
priorLocalRot = heavyInvent.transform.localEulerAngles;
priorScale = heavyInvent.transform.localScale;
heavyInvent.gameObject.transform.localPosition = Vector3.zero;
heavyInvent.gameObject.transform.localEulerAngles = Vector3.zero;
heavyInvent.transform.parent = null;
heavyInvent.gameObject.transform.localScale = priorScale;
heavyInvent.transform.parent = powerCoreCenter;
insertedCore = heavyInvent;
heavyInvent.gameObject.transform.localPosition = Vector3.zero;
heavyInvent.gameObject.transform.localEulerAngles = Vector3.zero;
heavyInvent.transform.parent = null;
heavyInvent.gameObject.transform.localScale = priorScale;
return true;
insertedCore = heavyInvent;
return true;
}
if (insertedCore != null && heavyInvent == null)
{
heavyInvent = insertedCore;
insertedCore = null;
//get ref of player perhaps
return true;
}
return false;
}
if (insertedCore != null && heavyInvent == null)
{
heavyInvent = insertedCore;
insertedCore = null;
//get ref of player perhaps
return true;
}
return false;
}
}

View File

@ -2,68 +2,71 @@ using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class FlareBeacon : MonoBehaviour
namespace Item
{
[SerializeField] private float range = 1;
[SerializeField] private float duration = 5f;
[SerializeField] private NavMeshObstacle obstacle;
private readonly List<GameObject> inRange = new();
private FlareRegister register;
public float Range => range;
// Start is called before the first frame update
private void Start()
public class FlareBeacon : MonoBehaviour
{
register = FlareRegister.instance;
register.beacons.Add(this);
transform.localEulerAngles = new Vector3(-89.98f, 0, 0);
var r = new Ray();
r.direction = -transform.forward;
r.origin = transform.position;
RaycastHit hit;
var rays = Physics.RaycastAll(r);
foreach (var _hit in rays)
[SerializeField] private float range = 1;
[SerializeField] private float duration = 5f;
[SerializeField] private NavMeshObstacle obstacle;
private readonly List<GameObject> inRange = new();
private Item.FlareRegister register;
public float Range => range;
// Start is called before the first frame update
private void Start()
{
if (_hit.transform.gameObject.GetComponent<FlareBeacon>() != null) continue;
transform.position = _hit.point;
break;
register = Item.FlareRegister.instance;
register.beacons.Add(this);
transform.localEulerAngles = new Vector3(-89.98f, 0, 0);
var r = new Ray();
r.direction = -transform.forward;
r.origin = transform.position;
RaycastHit hit;
var rays = Physics.RaycastAll(r);
foreach (var _hit in rays)
{
if (_hit.transform.gameObject.GetComponent<FlareBeacon>() != null) continue;
transform.position = _hit.point;
break;
}
if (Physics.Raycast(r, out hit))
{
// transform.position = hit.point;
}
if (obstacle != null)
obstacle.radius = range / 10;
}
if (Physics.Raycast(r, out hit))
// Update is called once per frame
private void Update()
{
// transform.position = hit.point;
}
if (obstacle != null)
obstacle.radius = range / 10;
}
private void OnDrawGizmosSelected()
{
// Draw a yellow sphere at the transform's position
Gizmos.color = Color.yellow;
// Update is called once per frame
private void Update()
{
}
private void OnDrawGizmosSelected()
{
// Draw a yellow sphere at the transform's position
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, range);
}
Gizmos.DrawWireSphere(transform.position, range);
}
private void OnTriggerEnter(Collider other)
{
inRange.Add(other.gameObject);
}
private void OnTriggerEnter(Collider other)
{
inRange.Add(other.gameObject);
}
private void OnTriggerExit(Collider other)
{
inRange.Remove(other.gameObject);
private void OnTriggerExit(Collider other)
{
inRange.Remove(other.gameObject);
}
}
}

View File

@ -1,21 +1,24 @@
public class GenericInteractable : InteractableItem
namespace Item
{
private void Awake()
public class GenericInteractable : InteractableItem
{
BaseAwake();
}
private void Awake()
{
BaseAwake();
}
private void Start()
{
}
private void Start()
{
}
public override bool Interact()
{
return false;
}
public override bool Interact()
{
return false;
}
public override bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent)
{
return Interact();
public override bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent)
{
return Interact();
}
}
}

View File

@ -1,46 +1,49 @@
using UnityEngine;
public class HeavyInteractableItem : InteractableItem
namespace Item
{
private Vector3 init_rot;
// Start is called before the first frame update
private void Start()
public class HeavyInteractableItem : InteractableItem
{
init_rot = transform.eulerAngles;
}
private Vector3 init_rot;
// Update is called once per frame
private void Update()
{
}
// Start is called before the first frame update
private void Start()
{
init_rot = transform.eulerAngles;
}
private void FixedUpdate()
{
BaseFixedUpdate();
//print("Alpha Target:"+ base.target_alpha);
}
// Update is called once per frame
private void Update()
{
}
public void DisableAll()
{
GetComponent<Collider>().enabled = false;
}
private void FixedUpdate()
{
BaseFixedUpdate();
//print("Alpha Target:"+ base.target_alpha);
}
public override bool Interact()
{
//Todo
return false;
}
public void DisableAll()
{
GetComponent<Collider>().enabled = false;
}
public override bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent)
{
return false;
}
public override bool Interact()
{
//Todo
return false;
}
public override bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent)
{
return false;
}
public void EnableAll()
{
GetComponent<Collider>().enabled = true;
transform.eulerAngles = new Vector3(init_rot.x, transform.eulerAngles.y, init_rot.z);
public void EnableAll()
{
GetComponent<Collider>().enabled = true;
transform.eulerAngles = new Vector3(init_rot.x, transform.eulerAngles.y, init_rot.z);
}
}
}

View File

@ -1,9 +1,13 @@
using UnityEngine;
public abstract class HeavyItemReceiver : InteractableItem
namespace Item
{
[SerializeField] [Tooltip("Specify the keyword search in the name of the item!")]
protected string searchString;
public abstract class HeavyItemReceiver : InteractableItem
{
[SerializeField]
[Tooltip("Specify the keyword search in the name of the item!")]
protected string searchString;
protected HeavyInteractableItem item;
protected HeavyInteractableItem item;
}
}

View File

@ -2,67 +2,70 @@ using TMPro;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Collider))]
[RequireComponent(typeof(Rigidbody))]
public abstract class InteractableItem : CarryableItem
namespace Item
{
[SerializeField] private Canvas interactionCanvas;
[SerializeField] protected bool canPickup;
private Image[] interaction_images;
private TMP_Text[] interaction_texts;
protected bool isEnabled;
protected float target_alpha;
public bool CanPickup => canPickup;
public bool IsEnabled => isEnabled;
private void Awake()
[RequireComponent(typeof(Collider))]
[RequireComponent(typeof(Rigidbody))]
public abstract class InteractableItem : CarryableItem
{
BaseAwake();
}
[SerializeField] private Canvas interactionCanvas;
private void FixedUpdate()
{
BaseFixedUpdate();
}
[SerializeField] protected bool canPickup;
public void Enable()
{
//print("Enabled!");
interactionCanvas.transform.LookAt(GameObject.FindGameObjectWithTag("MainCamera").transform.position);
interactionCanvas.transform.Rotate(0, 180, 0);
target_alpha = 1;
isEnabled = true;
}
private Image[] interaction_images;
private TMP_Text[] interaction_texts;
protected bool isEnabled;
protected float target_alpha;
public void Disable()
{
//print("Disabled!");
target_alpha = 0;
isEnabled = true;
}
public bool CanPickup => canPickup;
public bool IsEnabled => isEnabled;
public abstract bool Interact();
public abstract bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent);
private void Awake()
{
BaseAwake();
}
protected void BaseAwake()
{
interaction_texts = interactionCanvas.GetComponentsInChildren<TMP_Text>();
interaction_images = interactionCanvas.GetComponentsInChildren<Image>();
foreach (var text in interaction_texts) text.color = new Color(text.color.r, text.color.g, text.color.b, 0);
foreach (var image in interaction_images)
image.color = new Color(image.color.r, image.color.g, image.color.b, 0);
}
private void FixedUpdate()
{
BaseFixedUpdate();
}
protected void BaseFixedUpdate()
{
foreach (var text in interaction_texts)
text.color = Color.Lerp(new Color(text.color.r, text.color.g, text.color.b, text.color.a),
new Color(text.color.r, text.color.g, text.color.b, target_alpha), 10 * Time.deltaTime);
foreach (var image in interaction_images)
image.color = Color.Lerp(new Color(image.color.r, image.color.g, image.color.b, image.color.a),
new Color(image.color.r, image.color.g, image.color.b, target_alpha), 10 * Time.deltaTime);
public void Enable()
{
//print("Enabled!");
interactionCanvas.transform.LookAt(GameObject.FindGameObjectWithTag("MainCamera").transform.position);
interactionCanvas.transform.Rotate(0, 180, 0);
target_alpha = 1;
isEnabled = true;
}
public void Disable()
{
//print("Disabled!");
target_alpha = 0;
isEnabled = true;
}
public abstract bool Interact();
public abstract bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent);
protected void BaseAwake()
{
interaction_texts = interactionCanvas.GetComponentsInChildren<TMP_Text>();
interaction_images = interactionCanvas.GetComponentsInChildren<Image>();
foreach (var text in interaction_texts) text.color = new Color(text.color.r, text.color.g, text.color.b, 0);
foreach (var image in interaction_images)
image.color = new Color(image.color.r, image.color.g, image.color.b, 0);
}
protected void BaseFixedUpdate()
{
foreach (var text in interaction_texts)
text.color = Color.Lerp(new Color(text.color.r, text.color.g, text.color.b, text.color.a),
new Color(text.color.r, text.color.g, text.color.b, target_alpha), 10 * Time.deltaTime);
foreach (var image in interaction_images)
image.color = Color.Lerp(new Color(image.color.r, image.color.g, image.color.b, image.color.a),
new Color(image.color.r, image.color.g, image.color.b, target_alpha), 10 * Time.deltaTime);
}
}
}

View File

@ -1,29 +1,31 @@
using System;
using UnityEngine;
public class KeyItem : InteractableItem
namespace Item
{
[SerializeField] private string keyName;
public string KeyName => keyName;
private void Awake()
public class KeyItem : InteractableItem
{
BaseAwake();
}
[SerializeField] private string keyName;
private void Start()
{
}
public string KeyName => keyName;
public override bool Interact()
{
throw new NotImplementedException();
}
public override bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent)
{
return Interact();
private void Awake()
{
BaseAwake();
}
private void Start()
{
}
public override bool Interact()
{
throw new NotImplementedException();
}
public override bool Interact(ref Inventory inventory, ref HeavyInteractableItem heavyInvent)
{
return Interact();
}
}
}

View File

@ -1,40 +1,43 @@
using UnityEngine;
public class BulletComponent : MonoBehaviour
namespace Item
{
[SerializeField] private float duration = 5f;
[SerializeField] private string type = "flare";
[SerializeField] private float damageRange = 20f;
[SerializeField] private float damageMagnitude = 1f;
private float existed;
private FlareRegister register;
public float DamageMagnitude => damageMagnitude;
public float DamageRange => damageRange;
// Start is called before the first frame update
private void Start()
public class BulletComponent : MonoBehaviour
{
register = FlareRegister.instance;
register.bullets.Add(this);
}
[SerializeField] private float duration = 5f;
// Update is called once per frame
private void Update()
{
}
[SerializeField] private string type = "flare";
private void FixedUpdate()
{
if (existed >= duration)
[SerializeField] private float damageRange = 20f;
[SerializeField] private float damageMagnitude = 1f;
private float existed;
private Item.FlareRegister register;
public float DamageMagnitude => damageMagnitude;
public float DamageRange => damageRange;
// Start is called before the first frame update
private void Start()
{
register.bullets.Remove(this);
Destroy(gameObject);
register = Item.FlareRegister.instance;
register.bullets.Add(this);
}
existed += Time.fixedDeltaTime;
// Update is called once per frame
private void Update()
{
}
private void FixedUpdate()
{
if (existed >= duration)
{
register.bullets.Remove(this);
Destroy(gameObject);
}
existed += Time.fixedDeltaTime;
}
}
}

View File

@ -1,45 +1,48 @@
using UnityEngine;
public class PistolAnimationAimAssist : MonoBehaviour
namespace Item
{
public Transform leftShoulder;
public Transform rightShoulder;
[SerializeField] private bool isEnabled;
private Animator anim;
private Vector3 lTarget;
private Vector3 rTarget;
// Start is called before the first frame update
private void Start()
public class PistolAnimationAimAssist : MonoBehaviour
{
lTarget = new Vector3(72.9f, 122.2f, -129.9f);
rTarget = new Vector3(82f, 11f, -88f);
anim = GetComponent<Animator>();
}
public Transform leftShoulder;
public Transform rightShoulder;
// Update is called once per frame
private void Update()
{
if (isEnabled)
[SerializeField] private bool isEnabled;
private Animator anim;
private Vector3 lTarget;
private Vector3 rTarget;
// Start is called before the first frame update
private void Start()
{
anim.StopPlayback();
leftShoulder.transform.eulerAngles = lTarget;
rightShoulder.transform.eulerAngles = rTarget;
print("Applying!");
anim.StartPlayback();
lTarget = new Vector3(72.9f, 122.2f, -129.9f);
rTarget = new Vector3(82f, 11f, -88f);
anim = GetComponent<Animator>();
}
// Update is called once per frame
private void Update()
{
if (isEnabled)
{
anim.StopPlayback();
leftShoulder.transform.eulerAngles = lTarget;
rightShoulder.transform.eulerAngles = rTarget;
print("Applying!");
anim.StartPlayback();
}
}
public void Enable()
{
isEnabled = true;
}
public void Disable()
{
isEnabled = false;
}
}
public void Enable()
{
isEnabled = true;
}
public void Disable()
{
isEnabled = false;
}
}

View File

@ -1,189 +1,192 @@
using UnityEngine;
using UnityEngine.VFX;
public class PistolComponent : MonoBehaviour
namespace Item
{
public enum AimMode
public class PistolComponent : MonoBehaviour
{
GUN,
MODIFIED,
CAMERA
}
public AimMode aimMode = AimMode.CAMERA;
[SerializeField] private Light targetingLight;
[SerializeField] private GameObject targetObjectPrefab;
[SerializeField] public GameObject projectilePrefab;
[SerializeField] public string projectileName;
[SerializeField] private Transform bulletSpawnPoint;
[SerializeField] private float firePower = 20f;
[SerializeField] private float maxProjectileDuration = 5f;
[SerializeField] private float maxTargetObjDistance = 15f;
[SerializeField] private VisualEffect shootEffect;
[SerializeField] private Light shootLight;
[SerializeField] private float shootLightDuration = 0.1f;
[SerializeField] private LayerMask ignoreLayers;
private bool hasCloseTarget;
private bool IsEnabled;
private GameObject targetObject;
private float timeSinceLightDuration;
public bool IsLightOn => targetingLight.gameObject.activeSelf;
//private Dictionary<int,float> projectiles = new Dictionary<int, float>();
// Start is called before the first frame update
private void Start()
{
}
// Update is called once per frame
private void Update()
{
timeSinceLightDuration += Time.deltaTime;
}
private void FixedUpdate()
{
if (shootLight.gameObject.activeSelf && timeSinceLightDuration > shootLightDuration)
shootLight.gameObject.SetActive(false);
if (aimMode == AimMode.CAMERA) targetObject.gameObject.transform.position = Player.PlayerAim.active.targetPosition;
if (IsEnabled && aimMode != AimMode.CAMERA)
public enum AimMode
{
var ray = new Ray(transform.position, transform.up);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 50, ignoreLayers))
{
var hitDist = Vector3.Distance(hit.point, transform.position);
if (hitDist < maxTargetObjDistance)
{
targetObject.gameObject.transform.position = hit.point;
GUN,
MODIFIED,
CAMERA
}
targetObject.gameObject.GetComponent<MeshRenderer>().materials[0]
.SetColor("_EmissiveColor", new Color(255, 0, 0));
//Track if we have a close target
hasCloseTarget = true;
public AimMode aimMode = AimMode.CAMERA;
[SerializeField] private Light targetingLight;
[SerializeField] private GameObject targetObjectPrefab;
[SerializeField] public GameObject projectilePrefab;
[SerializeField] public string projectileName;
[SerializeField] private Transform bulletSpawnPoint;
[SerializeField] private float firePower = 20f;
[SerializeField] private float maxProjectileDuration = 5f;
[SerializeField] private float maxTargetObjDistance = 15f;
[SerializeField] private VisualEffect shootEffect;
[SerializeField] private Light shootLight;
[SerializeField] private float shootLightDuration = 0.1f;
[SerializeField] private LayerMask ignoreLayers;
private bool hasCloseTarget;
private bool IsEnabled;
private GameObject targetObject;
private float timeSinceLightDuration;
public bool IsLightOn => targetingLight.gameObject.activeSelf;
//private Dictionary<int,float> projectiles = new Dictionary<int, float>();
// Start is called before the first frame update
private void Start()
{
}
// Update is called once per frame
private void Update()
{
timeSinceLightDuration += Time.deltaTime;
}
private void FixedUpdate()
{
if (shootLight.gameObject.activeSelf && timeSinceLightDuration > shootLightDuration)
shootLight.gameObject.SetActive(false);
if (aimMode == AimMode.CAMERA) targetObject.gameObject.transform.position = Player.PlayerAim.active.targetPosition;
if (IsEnabled && aimMode != AimMode.CAMERA)
{
var ray = new Ray(transform.position, transform.up);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 50, ignoreLayers))
{
var hitDist = Vector3.Distance(hit.point, transform.position);
if (hitDist < maxTargetObjDistance)
{
targetObject.gameObject.transform.position = hit.point;
targetObject.gameObject.GetComponent<MeshRenderer>().materials[0]
.SetColor("_EmissiveColor", new Color(255, 0, 0));
//Track if we have a close target
hasCloseTarget = true;
}
else
{
targetObject.gameObject.transform.position =
transform.position + ray.direction * maxTargetObjDistance;
targetObject.gameObject.GetComponent<MeshRenderer>().materials[0]
.SetColor("_EmissiveColor", new Color(255, 255, 255));
//Track if we have a close target
hasCloseTarget = false;
}
//float drop = CalculateDrop(this.bulletSpawnPoint.position, hit.point, this.transform.up * this.firePower);
//print(drop);
}
else
{
targetObject.gameObject.transform.position =
transform.position + ray.direction * maxTargetObjDistance;
targetObject.gameObject.transform.position = transform.position + ray.direction * maxTargetObjDistance;
targetObject.gameObject.GetComponent<MeshRenderer>().materials[0]
.SetColor("_EmissiveColor", new Color(255, 255, 255));
//Track if we have a close target
hasCloseTarget = false;
}
//float drop = CalculateDrop(this.bulletSpawnPoint.position, hit.point, this.transform.up * this.firePower);
//print(drop);
}
else
{
targetObject.gameObject.transform.position = transform.position + ray.direction * maxTargetObjDistance;
targetObject.gameObject.GetComponent<MeshRenderer>().materials[0]
.SetColor("_EmissiveColor", new Color(255, 255, 255));
hasCloseTarget = false;
}
}
}
private float CalculateDrop(Vector3 origin, Vector3 destination, Vector3 force)
{
// Calculate the initial velocity required to reach the destination.
var displacement = destination - origin;
var time = Mathf.Sqrt(2f * displacement.magnitude / Physics.gravity.magnitude);
var velocity = (displacement - 0.5f * Physics.gravity * time * time) / time + force;
// Calculate the height the object will reach during its flight.
var maxHeight = origin.y + velocity.y * time - 0.5f * Physics.gravity.y * time * time;
// Calculate the distance the object will drop during its flight.
var dropDistance = maxHeight - destination.y;
return dropDistance;
}
public void Fire()
{
Fire(!hasCloseTarget);
}
public void Fire(bool offsetWithTargetBall)
{
shootLightDuration = 0;
shootLight.gameObject.SetActive(true);
var projectile = Instantiate(projectilePrefab, bulletSpawnPoint);
projectile.transform.localPosition = Vector3.zero;
projectile.transform.localEulerAngles = Vector3.zero;
projectile.transform.localScale = Vector3.one;
var pRigid = projectile.GetComponent<Rigidbody>();
/*Modified targeting system
1. Since aim direction is vector from camera to ball (where player thinks its gonna go), raycast forward there, till hit. If no hit,
then set target distance to ~50.
2. Modify launch vector apply modified force
*/
var launchVector = pRigid.transform.up * firePower;
if (offsetWithTargetBall || aimMode == AimMode.MODIFIED)
private float CalculateDrop(Vector3 origin, Vector3 destination, Vector3 force)
{
var ballCamVector = targetObject.transform.position -
GetComponentInParent<Player.PlayerMovementController>().cam.transform.position;
var r = new Ray();
r.origin = targetObject.transform.position;
r.direction = ballCamVector.normalized;
RaycastHit hit;
if (Physics.Raycast(r, out hit, ignoreLayers))
// Calculate the initial velocity required to reach the destination.
var displacement = destination - origin;
var time = Mathf.Sqrt(2f * displacement.magnitude / Physics.gravity.magnitude);
var velocity = (displacement - 0.5f * Physics.gravity * time * time) / time + force;
// Calculate the height the object will reach during its flight.
var maxHeight = origin.y + velocity.y * time - 0.5f * Physics.gravity.y * time * time;
// Calculate the distance the object will drop during its flight.
var dropDistance = maxHeight - destination.y;
return dropDistance;
}
public void Fire()
{
Fire(!hasCloseTarget);
}
public void Fire(bool offsetWithTargetBall)
{
shootLightDuration = 0;
shootLight.gameObject.SetActive(true);
var projectile = Instantiate(projectilePrefab, bulletSpawnPoint);
projectile.transform.localPosition = Vector3.zero;
projectile.transform.localEulerAngles = Vector3.zero;
projectile.transform.localScale = Vector3.one;
var pRigid = projectile.GetComponent<Rigidbody>();
/*Modified targeting system
1. Since aim direction is vector from camera to ball (where player thinks its gonna go), raycast forward there, till hit. If no hit,
then set target distance to ~50.
2. Modify launch vector apply modified force
*/
var launchVector = pRigid.transform.up * firePower;
if (offsetWithTargetBall || aimMode == AimMode.MODIFIED)
{
launchVector = (hit.point - pRigid.transform.position).normalized;
var ballCamVector = targetObject.transform.position -
GetComponentInParent<Player.PlayerMovementController>().cam.transform.position;
var r = new Ray();
r.origin = targetObject.transform.position;
r.direction = ballCamVector.normalized;
RaycastHit hit;
if (Physics.Raycast(r, out hit, ignoreLayers))
{
launchVector = (hit.point - pRigid.transform.position).normalized;
launchVector *= firePower;
}
}
else if (aimMode == AimMode.CAMERA)
{
var target = Player.PlayerAim.active.targetPosition;
var lv = target - pRigid.transform.position;
launchVector = lv.normalized;
launchVector *= firePower;
}
pRigid.AddForce(launchVector, ForceMode.Impulse);
projectile.transform.parent = null;
shootEffect.Play();
}
else if (aimMode == AimMode.CAMERA)
public void Enable()
{
var target = Player.PlayerAim.active.targetPosition;
var lv = target - pRigid.transform.position;
launchVector = lv.normalized;
launchVector *= firePower;
IsEnabled = true;
if (targetObject == null) targetObject = Instantiate(targetObjectPrefab);
}
pRigid.AddForce(launchVector, ForceMode.Impulse);
projectile.transform.parent = null;
shootEffect.Play();
}
public void Enable()
{
IsEnabled = true;
if (targetObject == null) targetObject = Instantiate(targetObjectPrefab);
}
public void Disable()
{
IsEnabled = false;
if (targetObject != null) Destroy(targetObject);
}
public void Disable()
{
IsEnabled = false;
if (targetObject != null) Destroy(targetObject);
}
public void LightToggle()
{
targetingLight.gameObject.SetActive(!targetingLight.gameObject.activeSelf);
public void LightToggle()
{
targetingLight.gameObject.SetActive(!targetingLight.gameObject.activeSelf);
}
}
}

View File

@ -1,21 +1,24 @@
using System.Collections.Generic;
using UnityEngine;
public class FlareRegister : MonoBehaviour
namespace Item
{
public static FlareRegister instance;
public List<BulletComponent> bullets = new();
public List<FlareBeacon> beacons = new();
// Start is called before the first frame update
private void Start()
public class FlareRegister : MonoBehaviour
{
instance = this;
}
public static FlareRegister instance;
public List<BulletComponent> bullets = new();
// Update is called once per frame
private void Update()
{
public List<FlareBeacon> beacons = new();
// Start is called before the first frame update
private void Start()
{
instance = this;
}
// Update is called once per frame
private void Update()
{
}
}
}

View File

@ -4,110 +4,113 @@ using TMPro;
using UnityEngine;
using UnityEngine.UI;
[Serializable]
public class ItemImageRef
namespace Item
{
public string name;
public GameObject item;
public Sprite icon;
}
public class SpecialItemCycler : MonoBehaviour
{
[SerializeField] private List<ItemImageRef> spawnableItems = new();
[SerializeField] private List<ItemImageRef> shootableItems = new();
[SerializeField] private Player.PlayerInteractionHandler interactionHandler;
[SerializeField] private PistolComponent pistol;
[SerializeField]
//private Inventory invent;
private TempInventory invent;
[SerializeField] private Image selectedImage;
[SerializeField] private TMP_Text selectedQuantityText;
private int shootableIndex;
private int spawnableIndex;
private Color sqtInitColor;
// Start is called before the first frame update
private void Start()
[Serializable]
public class ItemImageRef
{
sqtInitColor = selectedQuantityText.color;
public string name;
public GameObject item;
public Sprite icon;
}
// Update is called once per frame
private void Update()
public class SpecialItemCycler : MonoBehaviour
{
if (interactionHandler.GunEnabled)
[SerializeField] private List<ItemImageRef> spawnableItems = new();
[SerializeField] private List<ItemImageRef> shootableItems = new();
[SerializeField] private Player.PlayerInteractionHandler interactionHandler;
[SerializeField] private Item.PistolComponent pistol;
[SerializeField]
//private Inventory invent;
private TempInventory invent;
[SerializeField] private Image selectedImage;
[SerializeField] private TMP_Text selectedQuantityText;
private int shootableIndex;
private int spawnableIndex;
private Color sqtInitColor;
// Start is called before the first frame update
private void Start()
{
pistol.projectilePrefab = shootableItems[shootableIndex % shootableItems.Count].item;
pistol.projectileName = shootableItems[shootableIndex % shootableItems.Count].name;
sqtInitColor = selectedQuantityText.color;
}
SetImage();
if (Input.GetButtonDown("CycleItems"))
// Update is called once per frame
private void Update()
{
if (interactionHandler.GunEnabled)
{
pistol.projectilePrefab = shootableItems[shootableIndex % shootableItems.Count].item;
pistol.projectileName = shootableItems[shootableIndex % shootableItems.Count].name;
}
SetImage();
if (Input.GetButtonDown("CycleItems"))
{
if (interactionHandler.GunEnabled)
{
shootableIndex = (shootableIndex + 1) % shootableItems.Count;
selectedImage.sprite = shootableItems[shootableIndex].icon;
}
else
{
spawnableIndex = (spawnableIndex + 1) % spawnableItems.Count;
selectedImage.sprite = spawnableItems[spawnableIndex].icon;
}
if (selectedImage.sprite == null)
selectedImage.color = new Color(selectedImage.color.r, selectedImage.color.g, selectedImage.color.b, 0);
else
selectedImage.color = new Color(selectedImage.color.r, selectedImage.color.g, selectedImage.color.b, 1);
}
if (Input.GetButtonDown("TempPlace"))
if (invent.GetQuantityOf(spawnableItems[spawnableIndex].name) > 0)
if (!interactionHandler.GunEnabled && spawnableItems[spawnableIndex].item != null)
{
var prefab = spawnableItems[spawnableIndex].item;
var instance = Instantiate(prefab, interactionHandler.CarryingPos);
instance.transform.localPosition = Vector3.zero;
instance.transform.parent = null;
invent.Remove(spawnableItems[spawnableIndex].name);
}
}
private void SetImage()
{
if (interactionHandler.GunEnabled)
{
shootableIndex = (shootableIndex + 1) % shootableItems.Count;
selectedImage.sprite = shootableItems[shootableIndex].icon;
selectedQuantityText.text = invent.GetQuantityOf(shootableItems[shootableIndex].name).ToString();
}
else
{
spawnableIndex = (spawnableIndex + 1) % spawnableItems.Count;
selectedImage.sprite = spawnableItems[spawnableIndex].icon;
selectedQuantityText.text = invent.GetQuantityOf(spawnableItems[spawnableIndex].name).ToString();
}
if (selectedImage.sprite == null)
{
selectedImage.color = new Color(selectedImage.color.r, selectedImage.color.g, selectedImage.color.b, 0);
selectedQuantityText.gameObject.SetActive(false);
}
else
{
selectedImage.color = new Color(selectedImage.color.r, selectedImage.color.g, selectedImage.color.b, 1);
}
if (Input.GetButtonDown("TempPlace"))
if (invent.GetQuantityOf(spawnableItems[spawnableIndex].name) > 0)
if (!interactionHandler.GunEnabled && spawnableItems[spawnableIndex].item != null)
{
var prefab = spawnableItems[spawnableIndex].item;
var instance = Instantiate(prefab, interactionHandler.CarryingPos);
instance.transform.localPosition = Vector3.zero;
instance.transform.parent = null;
invent.Remove(spawnableItems[spawnableIndex].name);
}
}
private void SetImage()
{
if (interactionHandler.GunEnabled)
{
selectedImage.sprite = shootableItems[shootableIndex].icon;
selectedQuantityText.text = invent.GetQuantityOf(shootableItems[shootableIndex].name).ToString();
}
else
{
selectedImage.sprite = spawnableItems[spawnableIndex].icon;
selectedQuantityText.text = invent.GetQuantityOf(spawnableItems[spawnableIndex].name).ToString();
}
if (selectedImage.sprite == null)
{
selectedImage.color = new Color(selectedImage.color.r, selectedImage.color.g, selectedImage.color.b, 0);
selectedQuantityText.gameObject.SetActive(false);
}
else
{
selectedImage.color = new Color(selectedImage.color.r, selectedImage.color.g, selectedImage.color.b, 1);
selectedQuantityText.gameObject.SetActive(true);
if (selectedQuantityText.text == "0")
selectedQuantityText.color = Color.red;
else
selectedQuantityText.color = sqtInitColor;
selectedQuantityText.gameObject.SetActive(true);
if (selectedQuantityText.text == "0")
selectedQuantityText.color = Color.red;
else
selectedQuantityText.color = sqtInitColor;
}
}
}
}