From 1f08ab929a7379dbf4a91b2656639deeed949577 Mon Sep 17 00:00:00 2001
From: Malik Rafsanjani <pro.malikakbar2357@gmail.com>
Date: Sat, 8 Apr 2023 21:05:20 +0700
Subject: [PATCH] feat: finalize arrow and bow

---
 Assets/Prefabs/Arrow Variant.prefab          |   3 +-
 Assets/Scenes/MainScene.unity                | 285 +++++++++++++++++++
 Assets/Scripts/Player/Weapons/PlayerArrow.cs |  12 +-
 Assets/Scripts/Player/Weapons/PlayerBow.cs   |  54 +++-
 4 files changed, 339 insertions(+), 15 deletions(-)

diff --git a/Assets/Prefabs/Arrow Variant.prefab b/Assets/Prefabs/Arrow Variant.prefab
index 9f1391f..0d3cfb6 100644
--- a/Assets/Prefabs/Arrow Variant.prefab	
+++ b/Assets/Prefabs/Arrow Variant.prefab	
@@ -93,7 +93,7 @@ Rigidbody:
   m_Mass: 0.1
   m_Drag: 0
   m_AngularDrag: 0
-  m_UseGravity: 0
+  m_UseGravity: 1
   m_IsKinematic: 0
   m_Interpolate: 0
   m_Constraints: 0
@@ -124,5 +124,4 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 7f8c498c04cbf5a46a4a31fee6804c84, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  damage: 200
   torque: 0
diff --git a/Assets/Scenes/MainScene.unity b/Assets/Scenes/MainScene.unity
index 3b2df5e..1f419a8 100644
--- a/Assets/Scenes/MainScene.unity
+++ b/Assets/Scenes/MainScene.unity
@@ -375,6 +375,43 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 393736415}
   m_CullTransparentMesh: 1
+--- !u!1 &520206061
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 520206062}
+  m_Layer: 5
+  m_Name: Fill Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &520206062
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 520206061}
+  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:
+  - {fileID: 749821179}
+  m_Father: {fileID: 1495738172}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.25}
+  m_AnchorMax: {x: 1, y: 0.75}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
 --- !u!1 &556587518
 GameObject:
   m_ObjectHideFlags: 0
@@ -5681,6 +5718,82 @@ Transform:
   m_Father: {fileID: 0}
   m_RootOrder: 6
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &749821178
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 749821179}
+  - component: {fileID: 749821181}
+  - component: {fileID: 749821180}
+  m_Layer: 5
+  m_Name: Fill
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &749821179
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 749821178}
+  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: 520206062}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 10, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &749821180
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 749821178}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.9811321, g: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &749821181
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 749821178}
+  m_CullTransparentMesh: 1
 --- !u!1 &836626386
 GameObject:
   m_ObjectHideFlags: 0
@@ -5712,6 +5825,82 @@ Transform:
   m_Father: {fileID: 0}
   m_RootOrder: 9
   m_LocalEulerAnglesHint: {x: 0, y: 130, z: 0}
+--- !u!1 &845113955
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 845113956}
+  - component: {fileID: 845113958}
+  - component: {fileID: 845113957}
+  m_Layer: 5
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &845113956
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 845113955}
+  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: 1495738172}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.25}
+  m_AnchorMax: {x: 1, y: 0.75}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &845113957
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 845113955}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.34964728, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &845113958
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 845113955}
+  m_CullTransparentMesh: 1
 --- !u!1 &885835809
 GameObject:
   m_ObjectHideFlags: 0
@@ -6045,6 +6234,96 @@ RectTransform:
   m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 0, y: 0}
   m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1495738171
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1495738172}
+  - component: {fileID: 1495738173}
+  m_Layer: 5
+  m_Name: RechargeArrow
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1495738172
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1495738171}
+  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:
+  - {fileID: 845113956}
+  - {fileID: 520206062}
+  m_Father: {fileID: 2145307755}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 149, y: 75.9}
+  m_SizeDelta: {x: 160, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1495738173
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1495738171}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 0
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 0}
+  m_FillRect: {fileID: 749821179}
+  m_HandleRect: {fileID: 0}
+  m_Direction: 0
+  m_MinValue: 0
+  m_MaxValue: 100
+  m_WholeNumbers: 0
+  m_Value: 100
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
 --- !u!1 &1565704978
 GameObject:
   m_ObjectHideFlags: 0
@@ -6484,6 +6763,11 @@ MonoBehaviour:
   reloadTime: 1
   playerArrowPrefab: {fileID: 5707969127914954734, guid: 43ff8f8509c207f43a1a3b1c1520cdc6, type: 3}
   arrowSpawnPoint: {fileID: 331090232}
+  chargeSlider: {fileID: 1495738173}
+  chargeImage: {fileID: 0}
+  maxCharge: 3
+  colorMax: {r: 0, g: 1, b: 0, a: 1}
+  colorMin: {r: 1, g: 0, b: 0, a: 1}
 --- !u!4 &2079963337 stripped
 Transform:
   m_CorrespondingSourceObject: {fileID: 3766448033198164798, guid: 80e55f4de317be346be8e7fe0b4694a7, type: 3}
@@ -6673,6 +6957,7 @@ RectTransform:
   - {fileID: 167059736}
   - {fileID: 2081210583}
   - {fileID: 1565704979}
+  - {fileID: 1495738172}
   m_Father: {fileID: 0}
   m_RootOrder: 5
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
diff --git a/Assets/Scripts/Player/Weapons/PlayerArrow.cs b/Assets/Scripts/Player/Weapons/PlayerArrow.cs
index f50e2a1..801194d 100644
--- a/Assets/Scripts/Player/Weapons/PlayerArrow.cs
+++ b/Assets/Scripts/Player/Weapons/PlayerArrow.cs
@@ -4,9 +4,6 @@ using UnityEngine;
 
 public class PlayerArrow : MonoBehaviour
 {
-    [SerializeField]
-    private int damage;
-
     [SerializeField]
     private float torque;
 
@@ -14,6 +11,8 @@ public class PlayerArrow : MonoBehaviour
 
     private bool didHit;
 
+    private float damageMultiplier = 1f;
+
     private void Awake()
     {
         rb = GetComponent<Rigidbody>();
@@ -23,14 +22,15 @@ public class PlayerArrow : MonoBehaviour
 
     void OnTriggerEnter(Collider other)
     {
-        Debug.Log("Hitting " + other);
-
         if (didHit) return;
 
         didHit = true;
         if (other.gameObject.TryGetComponent<EnemyHealth>(out var enemyHealth))
         {
-            enemyHealth.TakeDamage(damage, enemyHealth.transform.position);
+            var energy = 0.5 * rb.mass * rb.velocity.magnitude * rb.velocity.magnitude;
+            var damage = energy * damageMultiplier;
+            Debug.Log("damage: "+ damage);
+            enemyHealth.TakeDamage((int)damage, enemyHealth.transform.position);
         }
 
         rb.velocity = Vector3.zero;
diff --git a/Assets/Scripts/Player/Weapons/PlayerBow.cs b/Assets/Scripts/Player/Weapons/PlayerBow.cs
index a6a949e..db61593 100644
--- a/Assets/Scripts/Player/Weapons/PlayerBow.cs
+++ b/Assets/Scripts/Player/Weapons/PlayerBow.cs
@@ -1,6 +1,7 @@
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using UnityEngine.UI;
 
 public class PlayerBow : MonoBehaviour
 {
@@ -16,9 +17,31 @@ public class PlayerBow : MonoBehaviour
     private PlayerArrow curArrow;
     private bool isReload = false;
 
+    public Slider chargeSlider;
+    [SerializeField]
+    private float maxCharge = 3f;
+    private float chargeTime = 0f;
+    private float arrowEnergy = 0f;
+
+    public Color colorMax = Color.green;
+    public Color colorMin = Color.red;
+
     void Awake()
     {
-        //ReloadArrow();
+        ResetCharge();
+        chargeSlider.gameObject.SetActive(true);
+    }
+
+    private void OnEnable()
+    {
+        ResetCharge();
+        chargeSlider.gameObject.SetActive(true);
+    }
+
+    private void OnDisable()
+    {
+        ResetCharge();
+        chargeSlider.gameObject.SetActive(false);
     }
 
     public void Reload()
@@ -30,12 +53,31 @@ public class PlayerBow : MonoBehaviour
 
     void Update()
     {
-        if (Input.GetMouseButtonDown(0))
+        arrowEnergy = chargeTime > maxCharge ? maxCharge : chargeTime;
+
+        if (Input.GetMouseButton(0))
         {
-            Shoot();
+            chargeSlider.value = arrowEnergy * 100;
+            chargeTime += Time.deltaTime;
+        }
+
+        if (Input.GetMouseButtonUp(0))
+        {
+            Shoot(arrowEnergy);
+            ResetCharge();
+        }
+
+        if (Input.GetKeyDown(KeyCode.J))
+        {
+            Shoot(0);
         }
     }
 
+    private void ResetCharge()
+    {
+        chargeTime = 0;
+        chargeSlider.value = 0;
+    }
 
     private IEnumerator ReloadCorutine()
     {
@@ -45,16 +87,14 @@ public class PlayerBow : MonoBehaviour
 
     private void ReloadArrow()
     {
-        /*curArrow.transform.SetParent(arrowSpawnPoint.transform, false);*/
         isReload = false;
     }
 
-    public void Shoot()
+    public void Shoot(float energy)
     {
         curArrow = Instantiate(playerArrowPrefab, transform.position, arrowSpawnPoint.transform.rotation);
         var force = curArrow.transform.forward;
-        curArrow.GetComponent<Rigidbody>().AddRelativeForce(force * -40);
-        // Reload();
+        curArrow.GetComponent<Rigidbody>().AddRelativeForce(-400 * energy * force);
     }
 
     public bool IsReady()
-- 
GitLab