diff --git a/Assets/Scenes/Beating-With-Sticks.unity b/Assets/Scenes/Beating-With-Sticks.unity index 4eb1744..c10911e 100644 --- a/Assets/Scenes/Beating-With-Sticks.unity +++ b/Assets/Scenes/Beating-With-Sticks.unity @@ -217,6 +217,103 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1158947384 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1158947385} + - component: {fileID: 1158947388} + - component: {fileID: 1158947387} + - component: {fileID: 1158947386} + m_Layer: 3 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1158947385 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158947384} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.022, y: 0.54, z: 0.584} + m_LocalScale: {x: 0.40011483, y: 0.2110746, z: 0.3931717} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1423233324} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1158947386 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158947384} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1158947387 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158947384} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c905fc84b924f604a824c53fb10bf855, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1158947388 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158947384} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1423233316 GameObject: m_ObjectHideFlags: 0 @@ -229,8 +326,8 @@ GameObject: - component: {fileID: 1423233323} - component: {fileID: 1423233322} - component: {fileID: 1423233321} - - component: {fileID: 1423233320} - component: {fileID: 1423233319} + - component: {fileID: 1423233325} - component: {fileID: 1423233318} - component: {fileID: 1423233317} m_Layer: 3 @@ -296,31 +393,6 @@ MonoBehaviour: cooldownSeconds: 1 cooldownActive: 0 interactKey: 102 ---- !u!114 &1423233320 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1423233316} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 93424cdca660b854faec02bc3325bc31, type: 3} - m_Name: - m_EditorClassIdentifier: - speed: 5 - turnSpeed: 720 - sprintSpeed: 10 - jumpForce: 2.5 - gravity: 9.8 - throwForce: {fileID: 1423233319} - forwardsKey: 119 - backwardsKey: 115 - leftKey: 97 - rightKey: 101 - sprintKey: 304 - jumpKey: 32 - hammer: 0 --- !u!136 &1423233321 CapsuleCollider: m_ObjectHideFlags: 0 @@ -396,10 +468,71 @@ Transform: m_LocalPosition: {x: -8.31, y: 2, z: 6.61} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 1158947385} m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1423233325 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423233316} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f1361d39a2e401545a42006ca4e951ed, type: 3} + m_Name: + m_EditorClassIdentifier: + speed: 5 + turnSpeed: 720 + sprintSpeed: 10 + jumpForce: 2.5 + gravity: 9.8 + throwForce: {fileID: 1423233319} + forwardsKey: 119 + backwardsKey: 115 + leftKey: 97 + rightKey: 101 + sprintKey: 304 + jumpKey: 32 + rockKey: 324 + hammer: 0 + rock: 1 + rockObject: {fileID: 1874423841} + spawnPoint: {fileID: 1158947384} +--- !u!1 &1477235389 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1477235390} + m_Layer: 0 + m_Name: CentrePoint + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1477235390 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1477235389} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1664811009 GameObject: m_ObjectHideFlags: 0 @@ -534,12 +667,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: b478d0ab1ff19cb4cb9e6161ea2a14d5, type: 3} m_Name: m_EditorClassIdentifier: - player: {fileID: 0} agent: {fileID: 0} - walkPoint: {x: 0, y: 0, z: 0} - walkPointSet: 0 - walkPointRange: 7 - playerInSightRange: 0 + range: 10 + centrePoint: {fileID: 1477235390} + isHit: 0 --- !u!135 &1664811016 SphereCollider: m_ObjectHideFlags: 0 @@ -553,6 +684,121 @@ SphereCollider: serializedVersion: 2 m_Radius: 9 m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &1874423841 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1874423845} + - component: {fileID: 1874423844} + - component: {fileID: 1874423843} + - component: {fileID: 1874423842} + - component: {fileID: 1874423846} + m_Layer: 0 + m_Name: Cylinder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!136 &1874423842 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1874423841} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1874423843 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1874423841} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1874423844 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1874423841} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1874423845 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1874423841} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 18.566313, y: -32.571102, z: -2.637422} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &1874423846 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1874423841} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &1947815994 GameObject: m_ObjectHideFlags: 0 @@ -781,7 +1027,7 @@ Camera: height: 1 near clip plane: 0.3 far clip plane: 1000 - field of view: 36 + field of view: 56 orthographic: 0 orthographic size: 5 m_Depth: -1 diff --git a/Assets/Scripts/StickBeatings/AIScript.cs b/Assets/Scripts/StickBeatings/AIScript.cs index c985f2f..fd4a0a0 100644 --- a/Assets/Scripts/StickBeatings/AIScript.cs +++ b/Assets/Scripts/StickBeatings/AIScript.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using System.Security.Cryptography; using UnityEngine; using UnityEngine.AI; @@ -11,103 +12,85 @@ using UnityEngine.AI; //TODO AI Script for the Stick Beating Game //* AI for enemies to run away from the character once in range //* AI should change direction every few seconds to make it harder for the player to hit them -//TODO AI should not go into a direction within the player's range +//* AI should not go into a direction within the player's range //* If player is not in range, AI should move randomly +//TODO Slow down AI when hit by player rock +//TODO AI dies if hit by player stick +//? Enemy AI gets stuck in corners - maybe have AI move in a random direction if it gets stuck public class AIScript : MonoBehaviour { - private bool runningCoroutine = false; - public GameObject player; public NavMeshAgent agent; - - //* Patroling - public Vector3 walkPoint; - public bool walkPointSet; - public float walkPointRange; - - //* States - public bool playerInSightRange = false; - - void Start() + public float range; + public Transform centrePoint; + private bool playerInRange = false; + public bool isHit = false; + private void Awake() { - - player = GameObject.Find("Capsule"); agent = GetComponent(); } - // Update is called once per frame - void Update() + private void Update() { - if(!playerInSightRange) Patroling(); - if(playerInSightRange) Running(); - } - - private void Patroling() - { - agent.speed = 3.5f; - if(!walkPointSet) SetWalkPointPatroling(); - - if(walkPointSet) - agent.SetDestination(walkPoint); - - Vector3 distanceToWalkPoint = transform.position - walkPoint; - - if(distanceToWalkPoint.magnitude < 1f) - walkPointSet = false; - } - - private void SetWalkPointPatroling() - { - float randomZ = Random.Range(-walkPointRange, walkPointRange); - float randomX = Random.Range(-walkPointRange, walkPointRange); - - walkPoint = new Vector3(randomX, transform.position.y, randomZ); - walkPointSet = true; - } - private void Running() - { - agent.speed = 6f; - if(!walkPointSet) SetWalkPointRunning(); - - if(walkPointSet) - agent.SetDestination(walkPoint); - if(!runningCoroutine) StartCoroutine(WaitTime()); - - Vector3 distanceToWalkPoint = transform.position - walkPoint; - - if(distanceToWalkPoint.magnitude < 1f) - walkPointSet = false; - - } - - private void SetWalkPointRunning() - { - float randomZ = Random.Range(-walkPointRange, walkPointRange); - float randomX = Random.Range(-walkPointRange, walkPointRange); - - walkPoint = new Vector3(randomX, transform.position.y, randomZ); - - walkPointSet = true; - } - - IEnumerator WaitTime() - { - runningCoroutine = true; - yield return new WaitForSeconds(Random.Range(2, 5)); - walkPointSet = false; - runningCoroutine = false; - } - - private void OnTriggerEnter(Collider other) { - if(other.gameObject == player) + if(agent.remainingDistance <= agent.stoppingDistance && !playerInRange) { - playerInSightRange = true; + Vector3 point; + if(RandomPoint(centrePoint.position, range, out point)) + { + Debug.DrawRay(point, Vector3.up, Color.blue, 1.0f); + agent.SetDestination(point); + } + } + else if(playerInRange && !isHit) + { + agent.speed = 7.0f; + RunAway(); + } + + if(isHit) + { + agent.speed = 1.75f; + } + else + { + agent.speed = 3.5f; } } - private void OnTriggerExit(Collider other) { - if(other.gameObject == player) + + void RunAway() + { + Vector3 direction = transform.position - centrePoint.position; + Vector3 runTo = transform.position + direction.normalized; + NavMeshHit hit; + NavMesh.SamplePosition(runTo, out hit, 5.0f, NavMesh.AllAreas); + agent.SetDestination(hit.position); + } + + bool RandomPoint(Vector3 center, float range, out Vector3 result) + { + Vector3 randompoint = center + Random.insideUnitSphere * range; + NavMeshHit hit; + if (NavMesh.SamplePosition(randompoint, out hit, 1.0f, NavMesh.AllAreas)) { - playerInSightRange = false; + result = hit.position; + return true; + } + result = Vector3.zero; + return false; + } + + private void OnTriggerEnter(Collider other) + { + if(other.tag == "Player") + { + playerInRange = true; + } + } + private void OnTriggerExit(Collider other) + { + if(other.tag == "Player") + { + playerInRange = false; } } } diff --git a/Assets/Scripts/StickBeatings/MovementStickBeating.cs b/Assets/Scripts/StickBeatings/MovementStickBeating.cs new file mode 100644 index 0000000..a5727e1 --- /dev/null +++ b/Assets/Scripts/StickBeatings/MovementStickBeating.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +//* General Comments or Finished Tasks +//TODO Tasks left to be done for game +//! Bugs or Issues +//? Questions or Suggestions + +//! Aftering hitting down with hammer, turning stops working in what direction the player tries to move first in +//! As with throwing objects, the rock sometimes goes in random directions and random speeds +//*TODO Playing StickBeating Game, player should be able to throw rocks every few seconds +//? Soft auto lock on enemies when throwing rocks +public class MovementStickBeating : MonoBehaviour +{ + public float speed = 7.0f; + public float turnSpeed; + public float sprintSpeed = 10.0f; + public float jumpForce; + public float gravity = 9.8f; + // public PickUpObject throwForce; + + private CharacterController controller; + private Vector3 moveDirection = Vector3.zero; + + [Header("Keybinds")] + public KeyCode forwardsKey = KeyCode.W; + public KeyCode backwardsKey = KeyCode.S; + public KeyCode leftKey = KeyCode.A; + public KeyCode rightKey = KeyCode.D; + public KeyCode sprintKey = KeyCode.LeftShift; + public KeyCode jumpKey = KeyCode.Space; + public KeyCode rockKey = KeyCode.Mouse1; + public bool hammer = false; + public bool rock = false; + public GameObject rockObject; + public GameObject spawnPoint; + + void Start() + { + controller = GetComponent(); + } + + void Update() + { + float forwards = Convert.ToSingle(Input.GetKey(forwardsKey)); + float backwards = Convert.ToSingle(Input.GetKey(backwardsKey)); + float left = Convert.ToSingle(Input.GetKey(leftKey)); + float right = Convert.ToSingle(Input.GetKey(rightKey)); + if (controller.isGrounded && !hammer) + { + moveDirection = new Vector3(right - left, 0, forwards - backwards); + //* Change the direction the player is facing based on the direction they are moving + if (right - left != 0 || forwards - backwards != 0) + { + Quaternion ToRotation = Quaternion.LookRotation(moveDirection); + transform.rotation = Quaternion.RotateTowards(transform.rotation, ToRotation, turnSpeed * Time.deltaTime); + } + + moveDirection *= speed; + jumpForce = 2.5f; + + if (Input.GetKeyDown(jumpKey)) + { + moveDirection.y = jumpForce; + } + //If player is moving diagonally, reduce speed + if (forwards != 0 && right != 0 || forwards != 0 && left != 0 || backwards != 0 && right != 0 || backwards != 0 && left != 0) + { + moveDirection *= 0.7f; + } + else + { + moveDirection *= 1.0f; + + } + + } + + if(hammer) + { + moveDirection = Vector3.zero; + } + + if(rock) + { + if(Input.GetKeyDown(rockKey)) + { + GameObject throwing = Instantiate(rockObject, spawnPoint.transform.position, spawnPoint.transform.rotation); + throwing.GetComponent().AddForce(transform.forward * 8.5f, ForceMode.Impulse); + } + } + + moveDirection.y -= gravity * Time.deltaTime; + controller.Move(moveDirection * Time.deltaTime); + } +} \ No newline at end of file diff --git a/Assets/Scripts/StickBeatings/MovementStickBeating.cs.meta b/Assets/Scripts/StickBeatings/MovementStickBeating.cs.meta new file mode 100644 index 0000000..f9a51ff --- /dev/null +++ b/Assets/Scripts/StickBeatings/MovementStickBeating.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1361d39a2e401545a42006ca4e951ed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: