diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.prefab b/Assets/Gameplay/Virus.prefab index 66504a4..e272c3b 100644 --- a/Assets/Gameplay/Virus.prefab +++ b/Assets/Gameplay/Virus.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2952408664780834224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4441512792082825468} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4441512792082825468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2952408664780834224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.013, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1498328307549180055} + m_Father: {fileID: 4145560279359410844} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6787116220008065685 GameObject: m_ObjectHideFlags: 0 @@ -27,10 +58,10 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6787116220008065685} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 1.22, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.43849, y: 0.43849, z: 0.43849} m_Children: [] - m_Father: {fileID: 4145560279359410844} + m_Father: {fileID: 4441512792082825468} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1980325977259363779 @@ -91,7 +122,7 @@ m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Radius: 0.55 m_Center: {x: 0, y: 0, z: 0} --- !u!1 &6877406027520012927 GameObject: @@ -105,6 +136,7 @@ - component: {fileID: 7496028867877103345} - component: {fileID: 8566340932116108959} - component: {fileID: 3276850821974423095} + - component: {fileID: 705066569827785281} m_Layer: 0 m_Name: Virus m_TagString: Untagged @@ -123,7 +155,7 @@ m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1498328307549180055} + - {fileID: 4441512792082825468} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -158,11 +190,14 @@ m_Script: {fileID: 11500000, guid: 54c3bb2bb08c27d4f991767e7847767a, type: 3} m_Name: m_EditorClassIdentifier: + MeshRoot: {fileID: 2952408664780834224} AttackMaxDist: 1.8 + RepathTime: 1.3 AttackTime: 0.2 AttackDistMult: 1.3 - Damage: 0.4 + Damage: 0.11 AttackWait: 0.8 + MinDamageDist: 0.6 --- !u!195 &3276850821974423095 NavMeshAgent: m_ObjectHideFlags: 0 @@ -185,3 +220,19 @@ m_BaseOffset: 0 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 +--- !u!54 &705066569827785281 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6877406027520012927} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.prefab b/Assets/Gameplay/Virus.prefab index 66504a4..e272c3b 100644 --- a/Assets/Gameplay/Virus.prefab +++ b/Assets/Gameplay/Virus.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2952408664780834224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4441512792082825468} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4441512792082825468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2952408664780834224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.013, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1498328307549180055} + m_Father: {fileID: 4145560279359410844} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6787116220008065685 GameObject: m_ObjectHideFlags: 0 @@ -27,10 +58,10 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6787116220008065685} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 1.22, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.43849, y: 0.43849, z: 0.43849} m_Children: [] - m_Father: {fileID: 4145560279359410844} + m_Father: {fileID: 4441512792082825468} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1980325977259363779 @@ -91,7 +122,7 @@ m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Radius: 0.55 m_Center: {x: 0, y: 0, z: 0} --- !u!1 &6877406027520012927 GameObject: @@ -105,6 +136,7 @@ - component: {fileID: 7496028867877103345} - component: {fileID: 8566340932116108959} - component: {fileID: 3276850821974423095} + - component: {fileID: 705066569827785281} m_Layer: 0 m_Name: Virus m_TagString: Untagged @@ -123,7 +155,7 @@ m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1498328307549180055} + - {fileID: 4441512792082825468} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -158,11 +190,14 @@ m_Script: {fileID: 11500000, guid: 54c3bb2bb08c27d4f991767e7847767a, type: 3} m_Name: m_EditorClassIdentifier: + MeshRoot: {fileID: 2952408664780834224} AttackMaxDist: 1.8 + RepathTime: 1.3 AttackTime: 0.2 AttackDistMult: 1.3 - Damage: 0.4 + Damage: 0.11 AttackWait: 0.8 + MinDamageDist: 0.6 --- !u!195 &3276850821974423095 NavMeshAgent: m_ObjectHideFlags: 0 @@ -185,3 +220,19 @@ m_BaseOffset: 0 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 +--- !u!54 &705066569827785281 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6877406027520012927} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Player/Player.cs b/Assets/Player/Player.cs index 42a65d0..3763c81 100644 --- a/Assets/Player/Player.cs +++ b/Assets/Player/Player.cs @@ -34,6 +34,18 @@ private float maxHealth = 0; private float health = 0; + public GameObject MeshRoot; + + public enum PlayerState + { + Remote, + Normal, + Attacking, + Dead + } + + public PlayerState State { get; private set; } + // Start is called before the first frame update void Awake() { @@ -42,6 +54,8 @@ netItem = GetComponentInChildren(); castLight = transform.Find("CastLight").gameObject; + if (attackTween == null) attackTween = new SimpleTween(); + uiHookup = FindObjectOfType(); if (ForceLocal) @@ -50,6 +64,8 @@ } viewRadius = DefaultViewRadius; + + State = PlayerState.Remote; } public GameObject PlayerMesh; @@ -59,6 +75,8 @@ public float BottomOffset { get { return bottomOffset; } } void StartLocal() { + State = PlayerState.Normal; + maxHealth = DefaultMaxHealth; health = DefaultMaxHealth; castLight.SetActive(true); @@ -133,6 +151,7 @@ private void OnDestroy() { shiftTween.Stop(); + attackTween.Stop(); } void StartRemote() @@ -160,6 +179,8 @@ public float MoveTouchFullZone = 0.7f; public float MoveTouchRadiusSize = 1.45f; + public float AttackTouchRadiusSize = 1.45f; + public float DefaultViewRadius = 5.5f; private float viewRadius; @@ -182,6 +203,8 @@ return current; } + private bool touchInAttack = false; + // Update is called once per frame void Update() { @@ -216,9 +239,9 @@ wantMove.Normalize(); - if (uiHookup != null && uiHookup.MoveTouch != null && uiHookup.MainCanvas != null) + if (uiHookup != null && uiHookup.MainCanvas != null) { - float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; + touches.Clear(); touches.AddRange(Input.touches); @@ -228,14 +251,39 @@ touches.Add(new Touch { position = Input.mousePosition }); } + bool wasInAttackTouch = touchInAttack; + touchInAttack = false; + foreach (Touch touch in touches) { + // movement touch + float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; Vector2 diff = new Vector2(); RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.MoveTouch, touch.position, null, out diff); if (diff.magnitude < radius) { wantMove = new Vector3(diff.x, 0, diff.y) / (radius * MoveTouchFullZone); if (wantMove.magnitude > 1) wantMove.Normalize(); + + break; + } + } + + foreach (Touch touch in touches) + { + float radius = uiHookup.AttackTouch.rect.width * 0.5f * AttackTouchRadiusSize; + Vector2 diff = new Vector2(); + RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.AttackTouch, touch.position, null, out diff); + if (diff.magnitude < radius && diff.magnitude > 0.2f) + { + if (!wasInAttackTouch && State == PlayerState.Normal) + { + Attack(new Vector3(diff.x, 0, diff.y)); + } + + touchInAttack = true; + + break; } } } @@ -258,7 +306,7 @@ } - if (wantMove.sqrMagnitude > 0) + if (wantMove.sqrMagnitude > 0 && State == PlayerState.Normal) { wantMove *= Speed * Time.deltaTime; wantMove.y = -0.1f * Time.deltaTime; @@ -270,4 +318,84 @@ } } + private SimpleTween attackTween; + + public float AttackTime = 0.2f; + public float AttackDist = 2f; + + public float Damage = 1f; + + + + private Vector3 attackDelta; + + private Vector3 lastAttackPos; + + private void Attack(Vector3 attackDir) + { + State = PlayerState.Attacking; + + attackDelta = attackDir.normalized * AttackDist; + + Vector3 startPos = transform.position; + lastAttackPos = startPos; + attackTween.Init( + v => + { + lastAttackPos = transform.position; + transform.position = startPos + attackDelta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + + attackTween.OnFinish = FinishedAttack; + } + + public float AttackWait = 0.8f; + + void OnTriggerEnter(Collider other) + { + if (State == PlayerState.Attacking) + { + Virus v = other.GetComponentInParent(); + if (v == null) + { + transform.position = lastAttackPos; + FinishedAttack(); + } + else + { + Item virusItem = v.GetComponentInChildren(); + if (virusItem != null && netItem.GetNetHost() != null) + { + netItem.GetNetHost().SendItemCommand(virusItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + } + } + } + } + + private void FinishedAttack() + { + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + State = PlayerState.Normal; + attackTween.Stop(); + /* + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + targetPlayer = null; + PathToPlayer(); + return; + } + + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) + { + attackTimer.Start(AttackWait, CheckAttackTarget); + } + else + { + targetPlayer = null; + PathToPlayer(); + } + */ + } } diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.prefab b/Assets/Gameplay/Virus.prefab index 66504a4..e272c3b 100644 --- a/Assets/Gameplay/Virus.prefab +++ b/Assets/Gameplay/Virus.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2952408664780834224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4441512792082825468} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4441512792082825468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2952408664780834224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.013, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1498328307549180055} + m_Father: {fileID: 4145560279359410844} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6787116220008065685 GameObject: m_ObjectHideFlags: 0 @@ -27,10 +58,10 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6787116220008065685} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 1.22, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.43849, y: 0.43849, z: 0.43849} m_Children: [] - m_Father: {fileID: 4145560279359410844} + m_Father: {fileID: 4441512792082825468} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1980325977259363779 @@ -91,7 +122,7 @@ m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Radius: 0.55 m_Center: {x: 0, y: 0, z: 0} --- !u!1 &6877406027520012927 GameObject: @@ -105,6 +136,7 @@ - component: {fileID: 7496028867877103345} - component: {fileID: 8566340932116108959} - component: {fileID: 3276850821974423095} + - component: {fileID: 705066569827785281} m_Layer: 0 m_Name: Virus m_TagString: Untagged @@ -123,7 +155,7 @@ m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1498328307549180055} + - {fileID: 4441512792082825468} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -158,11 +190,14 @@ m_Script: {fileID: 11500000, guid: 54c3bb2bb08c27d4f991767e7847767a, type: 3} m_Name: m_EditorClassIdentifier: + MeshRoot: {fileID: 2952408664780834224} AttackMaxDist: 1.8 + RepathTime: 1.3 AttackTime: 0.2 AttackDistMult: 1.3 - Damage: 0.4 + Damage: 0.11 AttackWait: 0.8 + MinDamageDist: 0.6 --- !u!195 &3276850821974423095 NavMeshAgent: m_ObjectHideFlags: 0 @@ -185,3 +220,19 @@ m_BaseOffset: 0 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 +--- !u!54 &705066569827785281 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6877406027520012927} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Player/Player.cs b/Assets/Player/Player.cs index 42a65d0..3763c81 100644 --- a/Assets/Player/Player.cs +++ b/Assets/Player/Player.cs @@ -34,6 +34,18 @@ private float maxHealth = 0; private float health = 0; + public GameObject MeshRoot; + + public enum PlayerState + { + Remote, + Normal, + Attacking, + Dead + } + + public PlayerState State { get; private set; } + // Start is called before the first frame update void Awake() { @@ -42,6 +54,8 @@ netItem = GetComponentInChildren(); castLight = transform.Find("CastLight").gameObject; + if (attackTween == null) attackTween = new SimpleTween(); + uiHookup = FindObjectOfType(); if (ForceLocal) @@ -50,6 +64,8 @@ } viewRadius = DefaultViewRadius; + + State = PlayerState.Remote; } public GameObject PlayerMesh; @@ -59,6 +75,8 @@ public float BottomOffset { get { return bottomOffset; } } void StartLocal() { + State = PlayerState.Normal; + maxHealth = DefaultMaxHealth; health = DefaultMaxHealth; castLight.SetActive(true); @@ -133,6 +151,7 @@ private void OnDestroy() { shiftTween.Stop(); + attackTween.Stop(); } void StartRemote() @@ -160,6 +179,8 @@ public float MoveTouchFullZone = 0.7f; public float MoveTouchRadiusSize = 1.45f; + public float AttackTouchRadiusSize = 1.45f; + public float DefaultViewRadius = 5.5f; private float viewRadius; @@ -182,6 +203,8 @@ return current; } + private bool touchInAttack = false; + // Update is called once per frame void Update() { @@ -216,9 +239,9 @@ wantMove.Normalize(); - if (uiHookup != null && uiHookup.MoveTouch != null && uiHookup.MainCanvas != null) + if (uiHookup != null && uiHookup.MainCanvas != null) { - float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; + touches.Clear(); touches.AddRange(Input.touches); @@ -228,14 +251,39 @@ touches.Add(new Touch { position = Input.mousePosition }); } + bool wasInAttackTouch = touchInAttack; + touchInAttack = false; + foreach (Touch touch in touches) { + // movement touch + float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; Vector2 diff = new Vector2(); RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.MoveTouch, touch.position, null, out diff); if (diff.magnitude < radius) { wantMove = new Vector3(diff.x, 0, diff.y) / (radius * MoveTouchFullZone); if (wantMove.magnitude > 1) wantMove.Normalize(); + + break; + } + } + + foreach (Touch touch in touches) + { + float radius = uiHookup.AttackTouch.rect.width * 0.5f * AttackTouchRadiusSize; + Vector2 diff = new Vector2(); + RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.AttackTouch, touch.position, null, out diff); + if (diff.magnitude < radius && diff.magnitude > 0.2f) + { + if (!wasInAttackTouch && State == PlayerState.Normal) + { + Attack(new Vector3(diff.x, 0, diff.y)); + } + + touchInAttack = true; + + break; } } } @@ -258,7 +306,7 @@ } - if (wantMove.sqrMagnitude > 0) + if (wantMove.sqrMagnitude > 0 && State == PlayerState.Normal) { wantMove *= Speed * Time.deltaTime; wantMove.y = -0.1f * Time.deltaTime; @@ -270,4 +318,84 @@ } } + private SimpleTween attackTween; + + public float AttackTime = 0.2f; + public float AttackDist = 2f; + + public float Damage = 1f; + + + + private Vector3 attackDelta; + + private Vector3 lastAttackPos; + + private void Attack(Vector3 attackDir) + { + State = PlayerState.Attacking; + + attackDelta = attackDir.normalized * AttackDist; + + Vector3 startPos = transform.position; + lastAttackPos = startPos; + attackTween.Init( + v => + { + lastAttackPos = transform.position; + transform.position = startPos + attackDelta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + + attackTween.OnFinish = FinishedAttack; + } + + public float AttackWait = 0.8f; + + void OnTriggerEnter(Collider other) + { + if (State == PlayerState.Attacking) + { + Virus v = other.GetComponentInParent(); + if (v == null) + { + transform.position = lastAttackPos; + FinishedAttack(); + } + else + { + Item virusItem = v.GetComponentInChildren(); + if (virusItem != null && netItem.GetNetHost() != null) + { + netItem.GetNetHost().SendItemCommand(virusItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + } + } + } + } + + private void FinishedAttack() + { + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + State = PlayerState.Normal; + attackTween.Stop(); + /* + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + targetPlayer = null; + PathToPlayer(); + return; + } + + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) + { + attackTimer.Start(AttackWait, CheckAttackTarget); + } + else + { + targetPlayer = null; + PathToPlayer(); + } + */ + } } diff --git a/Assets/Player/Player.prefab b/Assets/Player/Player.prefab index f0c3aec..457b3f3 100644 --- a/Assets/Player/Player.prefab +++ b/Assets/Player/Player.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &343309219727595444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2598280723270433121} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2598280723270433121 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343309219727595444} + 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_Children: + - {fileID: 1845617020995435930} + m_Father: {fileID: 1845617020408148629} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1845617019273958011 MonoBehaviour: m_ObjectHideFlags: 0 @@ -24,6 +55,7 @@ - component: {fileID: 2647236827943958594} - component: {fileID: 8076821645923605816} - component: {fileID: 446445004819590403} + - component: {fileID: 7181779030893752132} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -43,7 +75,7 @@ m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1845617019273958005} - - {fileID: 1845617020995435930} + - {fileID: 2598280723270433121} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -80,13 +112,19 @@ m_EditorClassIdentifier: ForceLocal: 0 DefaultMaxHealth: 1 + MeshRoot: {fileID: 343309219727595444} PlayerMesh: {fileID: 1845617020995435925} Speed: 8 MoveTouchFullZone: 0.6 MoveTouchRadiusSize: 1.45 - DefaultViewRadius: 5.5 + AttackTouchRadiusSize: 1.45 + DefaultViewRadius: 4.8 CamFollowAmount: 0.9 SpotFollowAmount: 0.96 + AttackTime: 0.2 + AttackDist: 2 + Damage: 1 + AttackWait: 0.8 --- !u!143 &446445004819590403 CharacterController: m_ObjectHideFlags: 0 @@ -105,6 +143,22 @@ m_SkinWidth: 0.08 m_MinMoveDistance: 0.001 m_Center: {x: 0, y: -0.26, z: 0} +--- !u!54 &7181779030893752132 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845617020408148631} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &1845617020995435925 GameObject: m_ObjectHideFlags: 0 @@ -131,12 +185,12 @@ m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1845617020995435925} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.61686, y: 0.61686, z: 0.61686} m_Children: [] - m_Father: {fileID: 1845617020408148629} - m_RootOrder: 1 + m_Father: {fileID: 2598280723270433121} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1845617020995435929 MeshFilter: @@ -194,7 +248,7 @@ m_GameObject: {fileID: 1845617020995435925} m_Material: {fileID: 0} m_IsTrigger: 1 - m_Enabled: 0 + m_Enabled: 1 serializedVersion: 2 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.prefab b/Assets/Gameplay/Virus.prefab index 66504a4..e272c3b 100644 --- a/Assets/Gameplay/Virus.prefab +++ b/Assets/Gameplay/Virus.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2952408664780834224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4441512792082825468} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4441512792082825468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2952408664780834224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.013, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1498328307549180055} + m_Father: {fileID: 4145560279359410844} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6787116220008065685 GameObject: m_ObjectHideFlags: 0 @@ -27,10 +58,10 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6787116220008065685} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 1.22, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.43849, y: 0.43849, z: 0.43849} m_Children: [] - m_Father: {fileID: 4145560279359410844} + m_Father: {fileID: 4441512792082825468} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1980325977259363779 @@ -91,7 +122,7 @@ m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Radius: 0.55 m_Center: {x: 0, y: 0, z: 0} --- !u!1 &6877406027520012927 GameObject: @@ -105,6 +136,7 @@ - component: {fileID: 7496028867877103345} - component: {fileID: 8566340932116108959} - component: {fileID: 3276850821974423095} + - component: {fileID: 705066569827785281} m_Layer: 0 m_Name: Virus m_TagString: Untagged @@ -123,7 +155,7 @@ m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1498328307549180055} + - {fileID: 4441512792082825468} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -158,11 +190,14 @@ m_Script: {fileID: 11500000, guid: 54c3bb2bb08c27d4f991767e7847767a, type: 3} m_Name: m_EditorClassIdentifier: + MeshRoot: {fileID: 2952408664780834224} AttackMaxDist: 1.8 + RepathTime: 1.3 AttackTime: 0.2 AttackDistMult: 1.3 - Damage: 0.4 + Damage: 0.11 AttackWait: 0.8 + MinDamageDist: 0.6 --- !u!195 &3276850821974423095 NavMeshAgent: m_ObjectHideFlags: 0 @@ -185,3 +220,19 @@ m_BaseOffset: 0 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 +--- !u!54 &705066569827785281 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6877406027520012927} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Player/Player.cs b/Assets/Player/Player.cs index 42a65d0..3763c81 100644 --- a/Assets/Player/Player.cs +++ b/Assets/Player/Player.cs @@ -34,6 +34,18 @@ private float maxHealth = 0; private float health = 0; + public GameObject MeshRoot; + + public enum PlayerState + { + Remote, + Normal, + Attacking, + Dead + } + + public PlayerState State { get; private set; } + // Start is called before the first frame update void Awake() { @@ -42,6 +54,8 @@ netItem = GetComponentInChildren(); castLight = transform.Find("CastLight").gameObject; + if (attackTween == null) attackTween = new SimpleTween(); + uiHookup = FindObjectOfType(); if (ForceLocal) @@ -50,6 +64,8 @@ } viewRadius = DefaultViewRadius; + + State = PlayerState.Remote; } public GameObject PlayerMesh; @@ -59,6 +75,8 @@ public float BottomOffset { get { return bottomOffset; } } void StartLocal() { + State = PlayerState.Normal; + maxHealth = DefaultMaxHealth; health = DefaultMaxHealth; castLight.SetActive(true); @@ -133,6 +151,7 @@ private void OnDestroy() { shiftTween.Stop(); + attackTween.Stop(); } void StartRemote() @@ -160,6 +179,8 @@ public float MoveTouchFullZone = 0.7f; public float MoveTouchRadiusSize = 1.45f; + public float AttackTouchRadiusSize = 1.45f; + public float DefaultViewRadius = 5.5f; private float viewRadius; @@ -182,6 +203,8 @@ return current; } + private bool touchInAttack = false; + // Update is called once per frame void Update() { @@ -216,9 +239,9 @@ wantMove.Normalize(); - if (uiHookup != null && uiHookup.MoveTouch != null && uiHookup.MainCanvas != null) + if (uiHookup != null && uiHookup.MainCanvas != null) { - float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; + touches.Clear(); touches.AddRange(Input.touches); @@ -228,14 +251,39 @@ touches.Add(new Touch { position = Input.mousePosition }); } + bool wasInAttackTouch = touchInAttack; + touchInAttack = false; + foreach (Touch touch in touches) { + // movement touch + float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; Vector2 diff = new Vector2(); RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.MoveTouch, touch.position, null, out diff); if (diff.magnitude < radius) { wantMove = new Vector3(diff.x, 0, diff.y) / (radius * MoveTouchFullZone); if (wantMove.magnitude > 1) wantMove.Normalize(); + + break; + } + } + + foreach (Touch touch in touches) + { + float radius = uiHookup.AttackTouch.rect.width * 0.5f * AttackTouchRadiusSize; + Vector2 diff = new Vector2(); + RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.AttackTouch, touch.position, null, out diff); + if (diff.magnitude < radius && diff.magnitude > 0.2f) + { + if (!wasInAttackTouch && State == PlayerState.Normal) + { + Attack(new Vector3(diff.x, 0, diff.y)); + } + + touchInAttack = true; + + break; } } } @@ -258,7 +306,7 @@ } - if (wantMove.sqrMagnitude > 0) + if (wantMove.sqrMagnitude > 0 && State == PlayerState.Normal) { wantMove *= Speed * Time.deltaTime; wantMove.y = -0.1f * Time.deltaTime; @@ -270,4 +318,84 @@ } } + private SimpleTween attackTween; + + public float AttackTime = 0.2f; + public float AttackDist = 2f; + + public float Damage = 1f; + + + + private Vector3 attackDelta; + + private Vector3 lastAttackPos; + + private void Attack(Vector3 attackDir) + { + State = PlayerState.Attacking; + + attackDelta = attackDir.normalized * AttackDist; + + Vector3 startPos = transform.position; + lastAttackPos = startPos; + attackTween.Init( + v => + { + lastAttackPos = transform.position; + transform.position = startPos + attackDelta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + + attackTween.OnFinish = FinishedAttack; + } + + public float AttackWait = 0.8f; + + void OnTriggerEnter(Collider other) + { + if (State == PlayerState.Attacking) + { + Virus v = other.GetComponentInParent(); + if (v == null) + { + transform.position = lastAttackPos; + FinishedAttack(); + } + else + { + Item virusItem = v.GetComponentInChildren(); + if (virusItem != null && netItem.GetNetHost() != null) + { + netItem.GetNetHost().SendItemCommand(virusItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + } + } + } + } + + private void FinishedAttack() + { + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + State = PlayerState.Normal; + attackTween.Stop(); + /* + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + targetPlayer = null; + PathToPlayer(); + return; + } + + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) + { + attackTimer.Start(AttackWait, CheckAttackTarget); + } + else + { + targetPlayer = null; + PathToPlayer(); + } + */ + } } diff --git a/Assets/Player/Player.prefab b/Assets/Player/Player.prefab index f0c3aec..457b3f3 100644 --- a/Assets/Player/Player.prefab +++ b/Assets/Player/Player.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &343309219727595444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2598280723270433121} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2598280723270433121 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343309219727595444} + 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_Children: + - {fileID: 1845617020995435930} + m_Father: {fileID: 1845617020408148629} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1845617019273958011 MonoBehaviour: m_ObjectHideFlags: 0 @@ -24,6 +55,7 @@ - component: {fileID: 2647236827943958594} - component: {fileID: 8076821645923605816} - component: {fileID: 446445004819590403} + - component: {fileID: 7181779030893752132} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -43,7 +75,7 @@ m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1845617019273958005} - - {fileID: 1845617020995435930} + - {fileID: 2598280723270433121} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -80,13 +112,19 @@ m_EditorClassIdentifier: ForceLocal: 0 DefaultMaxHealth: 1 + MeshRoot: {fileID: 343309219727595444} PlayerMesh: {fileID: 1845617020995435925} Speed: 8 MoveTouchFullZone: 0.6 MoveTouchRadiusSize: 1.45 - DefaultViewRadius: 5.5 + AttackTouchRadiusSize: 1.45 + DefaultViewRadius: 4.8 CamFollowAmount: 0.9 SpotFollowAmount: 0.96 + AttackTime: 0.2 + AttackDist: 2 + Damage: 1 + AttackWait: 0.8 --- !u!143 &446445004819590403 CharacterController: m_ObjectHideFlags: 0 @@ -105,6 +143,22 @@ m_SkinWidth: 0.08 m_MinMoveDistance: 0.001 m_Center: {x: 0, y: -0.26, z: 0} +--- !u!54 &7181779030893752132 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845617020408148631} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &1845617020995435925 GameObject: m_ObjectHideFlags: 0 @@ -131,12 +185,12 @@ m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1845617020995435925} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.61686, y: 0.61686, z: 0.61686} m_Children: [] - m_Father: {fileID: 1845617020408148629} - m_RootOrder: 1 + m_Father: {fileID: 2598280723270433121} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1845617020995435929 MeshFilter: @@ -194,7 +248,7 @@ m_GameObject: {fileID: 1845617020995435925} m_Material: {fileID: 0} m_IsTrigger: 1 - m_Enabled: 0 + m_Enabled: 1 serializedVersion: 2 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/Player/UIHookup.cs b/Assets/Player/UIHookup.cs index 7a6a21d..d5ad9a0 100644 --- a/Assets/Player/UIHookup.cs +++ b/Assets/Player/UIHookup.cs @@ -5,6 +5,7 @@ public class UIHookup : MonoBehaviour { public RectTransform MoveTouch; + public RectTransform AttackTouch; public Canvas MainCanvas; public RectTransform Health; diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.prefab b/Assets/Gameplay/Virus.prefab index 66504a4..e272c3b 100644 --- a/Assets/Gameplay/Virus.prefab +++ b/Assets/Gameplay/Virus.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2952408664780834224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4441512792082825468} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4441512792082825468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2952408664780834224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.013, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1498328307549180055} + m_Father: {fileID: 4145560279359410844} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6787116220008065685 GameObject: m_ObjectHideFlags: 0 @@ -27,10 +58,10 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6787116220008065685} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 1.22, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.43849, y: 0.43849, z: 0.43849} m_Children: [] - m_Father: {fileID: 4145560279359410844} + m_Father: {fileID: 4441512792082825468} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1980325977259363779 @@ -91,7 +122,7 @@ m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Radius: 0.55 m_Center: {x: 0, y: 0, z: 0} --- !u!1 &6877406027520012927 GameObject: @@ -105,6 +136,7 @@ - component: {fileID: 7496028867877103345} - component: {fileID: 8566340932116108959} - component: {fileID: 3276850821974423095} + - component: {fileID: 705066569827785281} m_Layer: 0 m_Name: Virus m_TagString: Untagged @@ -123,7 +155,7 @@ m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1498328307549180055} + - {fileID: 4441512792082825468} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -158,11 +190,14 @@ m_Script: {fileID: 11500000, guid: 54c3bb2bb08c27d4f991767e7847767a, type: 3} m_Name: m_EditorClassIdentifier: + MeshRoot: {fileID: 2952408664780834224} AttackMaxDist: 1.8 + RepathTime: 1.3 AttackTime: 0.2 AttackDistMult: 1.3 - Damage: 0.4 + Damage: 0.11 AttackWait: 0.8 + MinDamageDist: 0.6 --- !u!195 &3276850821974423095 NavMeshAgent: m_ObjectHideFlags: 0 @@ -185,3 +220,19 @@ m_BaseOffset: 0 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 +--- !u!54 &705066569827785281 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6877406027520012927} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Player/Player.cs b/Assets/Player/Player.cs index 42a65d0..3763c81 100644 --- a/Assets/Player/Player.cs +++ b/Assets/Player/Player.cs @@ -34,6 +34,18 @@ private float maxHealth = 0; private float health = 0; + public GameObject MeshRoot; + + public enum PlayerState + { + Remote, + Normal, + Attacking, + Dead + } + + public PlayerState State { get; private set; } + // Start is called before the first frame update void Awake() { @@ -42,6 +54,8 @@ netItem = GetComponentInChildren(); castLight = transform.Find("CastLight").gameObject; + if (attackTween == null) attackTween = new SimpleTween(); + uiHookup = FindObjectOfType(); if (ForceLocal) @@ -50,6 +64,8 @@ } viewRadius = DefaultViewRadius; + + State = PlayerState.Remote; } public GameObject PlayerMesh; @@ -59,6 +75,8 @@ public float BottomOffset { get { return bottomOffset; } } void StartLocal() { + State = PlayerState.Normal; + maxHealth = DefaultMaxHealth; health = DefaultMaxHealth; castLight.SetActive(true); @@ -133,6 +151,7 @@ private void OnDestroy() { shiftTween.Stop(); + attackTween.Stop(); } void StartRemote() @@ -160,6 +179,8 @@ public float MoveTouchFullZone = 0.7f; public float MoveTouchRadiusSize = 1.45f; + public float AttackTouchRadiusSize = 1.45f; + public float DefaultViewRadius = 5.5f; private float viewRadius; @@ -182,6 +203,8 @@ return current; } + private bool touchInAttack = false; + // Update is called once per frame void Update() { @@ -216,9 +239,9 @@ wantMove.Normalize(); - if (uiHookup != null && uiHookup.MoveTouch != null && uiHookup.MainCanvas != null) + if (uiHookup != null && uiHookup.MainCanvas != null) { - float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; + touches.Clear(); touches.AddRange(Input.touches); @@ -228,14 +251,39 @@ touches.Add(new Touch { position = Input.mousePosition }); } + bool wasInAttackTouch = touchInAttack; + touchInAttack = false; + foreach (Touch touch in touches) { + // movement touch + float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; Vector2 diff = new Vector2(); RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.MoveTouch, touch.position, null, out diff); if (diff.magnitude < radius) { wantMove = new Vector3(diff.x, 0, diff.y) / (radius * MoveTouchFullZone); if (wantMove.magnitude > 1) wantMove.Normalize(); + + break; + } + } + + foreach (Touch touch in touches) + { + float radius = uiHookup.AttackTouch.rect.width * 0.5f * AttackTouchRadiusSize; + Vector2 diff = new Vector2(); + RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.AttackTouch, touch.position, null, out diff); + if (diff.magnitude < radius && diff.magnitude > 0.2f) + { + if (!wasInAttackTouch && State == PlayerState.Normal) + { + Attack(new Vector3(diff.x, 0, diff.y)); + } + + touchInAttack = true; + + break; } } } @@ -258,7 +306,7 @@ } - if (wantMove.sqrMagnitude > 0) + if (wantMove.sqrMagnitude > 0 && State == PlayerState.Normal) { wantMove *= Speed * Time.deltaTime; wantMove.y = -0.1f * Time.deltaTime; @@ -270,4 +318,84 @@ } } + private SimpleTween attackTween; + + public float AttackTime = 0.2f; + public float AttackDist = 2f; + + public float Damage = 1f; + + + + private Vector3 attackDelta; + + private Vector3 lastAttackPos; + + private void Attack(Vector3 attackDir) + { + State = PlayerState.Attacking; + + attackDelta = attackDir.normalized * AttackDist; + + Vector3 startPos = transform.position; + lastAttackPos = startPos; + attackTween.Init( + v => + { + lastAttackPos = transform.position; + transform.position = startPos + attackDelta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + + attackTween.OnFinish = FinishedAttack; + } + + public float AttackWait = 0.8f; + + void OnTriggerEnter(Collider other) + { + if (State == PlayerState.Attacking) + { + Virus v = other.GetComponentInParent(); + if (v == null) + { + transform.position = lastAttackPos; + FinishedAttack(); + } + else + { + Item virusItem = v.GetComponentInChildren(); + if (virusItem != null && netItem.GetNetHost() != null) + { + netItem.GetNetHost().SendItemCommand(virusItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + } + } + } + } + + private void FinishedAttack() + { + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + State = PlayerState.Normal; + attackTween.Stop(); + /* + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + targetPlayer = null; + PathToPlayer(); + return; + } + + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) + { + attackTimer.Start(AttackWait, CheckAttackTarget); + } + else + { + targetPlayer = null; + PathToPlayer(); + } + */ + } } diff --git a/Assets/Player/Player.prefab b/Assets/Player/Player.prefab index f0c3aec..457b3f3 100644 --- a/Assets/Player/Player.prefab +++ b/Assets/Player/Player.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &343309219727595444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2598280723270433121} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2598280723270433121 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343309219727595444} + 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_Children: + - {fileID: 1845617020995435930} + m_Father: {fileID: 1845617020408148629} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1845617019273958011 MonoBehaviour: m_ObjectHideFlags: 0 @@ -24,6 +55,7 @@ - component: {fileID: 2647236827943958594} - component: {fileID: 8076821645923605816} - component: {fileID: 446445004819590403} + - component: {fileID: 7181779030893752132} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -43,7 +75,7 @@ m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1845617019273958005} - - {fileID: 1845617020995435930} + - {fileID: 2598280723270433121} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -80,13 +112,19 @@ m_EditorClassIdentifier: ForceLocal: 0 DefaultMaxHealth: 1 + MeshRoot: {fileID: 343309219727595444} PlayerMesh: {fileID: 1845617020995435925} Speed: 8 MoveTouchFullZone: 0.6 MoveTouchRadiusSize: 1.45 - DefaultViewRadius: 5.5 + AttackTouchRadiusSize: 1.45 + DefaultViewRadius: 4.8 CamFollowAmount: 0.9 SpotFollowAmount: 0.96 + AttackTime: 0.2 + AttackDist: 2 + Damage: 1 + AttackWait: 0.8 --- !u!143 &446445004819590403 CharacterController: m_ObjectHideFlags: 0 @@ -105,6 +143,22 @@ m_SkinWidth: 0.08 m_MinMoveDistance: 0.001 m_Center: {x: 0, y: -0.26, z: 0} +--- !u!54 &7181779030893752132 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845617020408148631} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &1845617020995435925 GameObject: m_ObjectHideFlags: 0 @@ -131,12 +185,12 @@ m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1845617020995435925} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.61686, y: 0.61686, z: 0.61686} m_Children: [] - m_Father: {fileID: 1845617020408148629} - m_RootOrder: 1 + m_Father: {fileID: 2598280723270433121} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1845617020995435929 MeshFilter: @@ -194,7 +248,7 @@ m_GameObject: {fileID: 1845617020995435925} m_Material: {fileID: 0} m_IsTrigger: 1 - m_Enabled: 0 + m_Enabled: 1 serializedVersion: 2 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/Player/UIHookup.cs b/Assets/Player/UIHookup.cs index 7a6a21d..d5ad9a0 100644 --- a/Assets/Player/UIHookup.cs +++ b/Assets/Player/UIHookup.cs @@ -5,6 +5,7 @@ public class UIHookup : MonoBehaviour { public RectTransform MoveTouch; + public RectTransform AttackTouch; public Canvas MainCanvas; public RectTransform Health; diff --git a/Assets/Scenes/Lobby.unity b/Assets/Scenes/Lobby.unity index b8e76a1..f05679c 100644 --- a/Assets/Scenes/Lobby.unity +++ b/Assets/Scenes/Lobby.unity @@ -752,7 +752,7 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 519420028} m_LocalRotation: {x: 0.6219096, y: -0, z: -0, w: 0.7830891} - m_LocalPosition: {x: 1.88, y: 15.09, z: -4.1} + m_LocalPosition: {x: 1.88, y: 10.13, z: -2.5} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 1145059467} @@ -1128,7 +1128,7 @@ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 18.6} + m_AnchoredPosition: {x: 0, y: 18.599976} m_SizeDelta: {x: 650, y: 15.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &747122217 @@ -1423,6 +1423,79 @@ type: 3} m_PrefabInstance: {fileID: 1071739189} m_PrefabAsset: {fileID: 0} +--- !u!1 &1086344763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1086344764} + - component: {fileID: 1086344766} + - component: {fileID: 1086344765} + m_Layer: 5 + m_Name: Attack + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1086344764 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.7835172, y: 1.7835172, z: 1.7835172} + m_Children: [] + m_Father: {fileID: 2078452658} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -101, y: 96} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1086344765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ec3edcde9ec42984889460ab3fa54616, type: 3} + m_Type: 0 + 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 &1086344766 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + m_CullTransparentMesh: 0 --- !u!1 &1088763451 GameObject: m_ObjectHideFlags: 0 @@ -1526,7 +1599,7 @@ m_Component: - component: {fileID: 1145059467} m_Layer: 0 - m_Name: GameObject + m_Name: CameraHolder m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2272,7 +2345,6 @@ serializedVersion: 6 m_Component: - component: {fileID: 1917456052} - - component: {fileID: 1917456051} - component: {fileID: 1917456050} m_Layer: 0 m_Name: UIHookup @@ -2294,23 +2366,9 @@ m_Name: m_EditorClassIdentifier: MoveTouch: {fileID: 1731919963} + AttackTouch: {fileID: 1086344764} MainCanvas: {fileID: 2078452657} Health: {fileID: 747122216} ---- !u!114 &1917456051 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1917456049} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b8368d89d0c587f45aefff388426bd1f, type: 3} - m_Name: - m_EditorClassIdentifier: - MoveTouch: {fileID: 0} - MainCanvas: {fileID: 0} - Health: {fileID: 0} --- !u!4 &1917456052 Transform: m_ObjectHideFlags: 0 @@ -2702,6 +2760,7 @@ m_Children: - {fileID: 747122216} - {fileID: 1731919963} + - {fileID: 1086344764} m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.prefab b/Assets/Gameplay/Virus.prefab index 66504a4..e272c3b 100644 --- a/Assets/Gameplay/Virus.prefab +++ b/Assets/Gameplay/Virus.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2952408664780834224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4441512792082825468} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4441512792082825468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2952408664780834224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.013, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1498328307549180055} + m_Father: {fileID: 4145560279359410844} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6787116220008065685 GameObject: m_ObjectHideFlags: 0 @@ -27,10 +58,10 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6787116220008065685} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 1.22, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.43849, y: 0.43849, z: 0.43849} m_Children: [] - m_Father: {fileID: 4145560279359410844} + m_Father: {fileID: 4441512792082825468} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1980325977259363779 @@ -91,7 +122,7 @@ m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Radius: 0.55 m_Center: {x: 0, y: 0, z: 0} --- !u!1 &6877406027520012927 GameObject: @@ -105,6 +136,7 @@ - component: {fileID: 7496028867877103345} - component: {fileID: 8566340932116108959} - component: {fileID: 3276850821974423095} + - component: {fileID: 705066569827785281} m_Layer: 0 m_Name: Virus m_TagString: Untagged @@ -123,7 +155,7 @@ m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1498328307549180055} + - {fileID: 4441512792082825468} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -158,11 +190,14 @@ m_Script: {fileID: 11500000, guid: 54c3bb2bb08c27d4f991767e7847767a, type: 3} m_Name: m_EditorClassIdentifier: + MeshRoot: {fileID: 2952408664780834224} AttackMaxDist: 1.8 + RepathTime: 1.3 AttackTime: 0.2 AttackDistMult: 1.3 - Damage: 0.4 + Damage: 0.11 AttackWait: 0.8 + MinDamageDist: 0.6 --- !u!195 &3276850821974423095 NavMeshAgent: m_ObjectHideFlags: 0 @@ -185,3 +220,19 @@ m_BaseOffset: 0 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 +--- !u!54 &705066569827785281 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6877406027520012927} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Player/Player.cs b/Assets/Player/Player.cs index 42a65d0..3763c81 100644 --- a/Assets/Player/Player.cs +++ b/Assets/Player/Player.cs @@ -34,6 +34,18 @@ private float maxHealth = 0; private float health = 0; + public GameObject MeshRoot; + + public enum PlayerState + { + Remote, + Normal, + Attacking, + Dead + } + + public PlayerState State { get; private set; } + // Start is called before the first frame update void Awake() { @@ -42,6 +54,8 @@ netItem = GetComponentInChildren(); castLight = transform.Find("CastLight").gameObject; + if (attackTween == null) attackTween = new SimpleTween(); + uiHookup = FindObjectOfType(); if (ForceLocal) @@ -50,6 +64,8 @@ } viewRadius = DefaultViewRadius; + + State = PlayerState.Remote; } public GameObject PlayerMesh; @@ -59,6 +75,8 @@ public float BottomOffset { get { return bottomOffset; } } void StartLocal() { + State = PlayerState.Normal; + maxHealth = DefaultMaxHealth; health = DefaultMaxHealth; castLight.SetActive(true); @@ -133,6 +151,7 @@ private void OnDestroy() { shiftTween.Stop(); + attackTween.Stop(); } void StartRemote() @@ -160,6 +179,8 @@ public float MoveTouchFullZone = 0.7f; public float MoveTouchRadiusSize = 1.45f; + public float AttackTouchRadiusSize = 1.45f; + public float DefaultViewRadius = 5.5f; private float viewRadius; @@ -182,6 +203,8 @@ return current; } + private bool touchInAttack = false; + // Update is called once per frame void Update() { @@ -216,9 +239,9 @@ wantMove.Normalize(); - if (uiHookup != null && uiHookup.MoveTouch != null && uiHookup.MainCanvas != null) + if (uiHookup != null && uiHookup.MainCanvas != null) { - float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; + touches.Clear(); touches.AddRange(Input.touches); @@ -228,14 +251,39 @@ touches.Add(new Touch { position = Input.mousePosition }); } + bool wasInAttackTouch = touchInAttack; + touchInAttack = false; + foreach (Touch touch in touches) { + // movement touch + float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; Vector2 diff = new Vector2(); RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.MoveTouch, touch.position, null, out diff); if (diff.magnitude < radius) { wantMove = new Vector3(diff.x, 0, diff.y) / (radius * MoveTouchFullZone); if (wantMove.magnitude > 1) wantMove.Normalize(); + + break; + } + } + + foreach (Touch touch in touches) + { + float radius = uiHookup.AttackTouch.rect.width * 0.5f * AttackTouchRadiusSize; + Vector2 diff = new Vector2(); + RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.AttackTouch, touch.position, null, out diff); + if (diff.magnitude < radius && diff.magnitude > 0.2f) + { + if (!wasInAttackTouch && State == PlayerState.Normal) + { + Attack(new Vector3(diff.x, 0, diff.y)); + } + + touchInAttack = true; + + break; } } } @@ -258,7 +306,7 @@ } - if (wantMove.sqrMagnitude > 0) + if (wantMove.sqrMagnitude > 0 && State == PlayerState.Normal) { wantMove *= Speed * Time.deltaTime; wantMove.y = -0.1f * Time.deltaTime; @@ -270,4 +318,84 @@ } } + private SimpleTween attackTween; + + public float AttackTime = 0.2f; + public float AttackDist = 2f; + + public float Damage = 1f; + + + + private Vector3 attackDelta; + + private Vector3 lastAttackPos; + + private void Attack(Vector3 attackDir) + { + State = PlayerState.Attacking; + + attackDelta = attackDir.normalized * AttackDist; + + Vector3 startPos = transform.position; + lastAttackPos = startPos; + attackTween.Init( + v => + { + lastAttackPos = transform.position; + transform.position = startPos + attackDelta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + + attackTween.OnFinish = FinishedAttack; + } + + public float AttackWait = 0.8f; + + void OnTriggerEnter(Collider other) + { + if (State == PlayerState.Attacking) + { + Virus v = other.GetComponentInParent(); + if (v == null) + { + transform.position = lastAttackPos; + FinishedAttack(); + } + else + { + Item virusItem = v.GetComponentInChildren(); + if (virusItem != null && netItem.GetNetHost() != null) + { + netItem.GetNetHost().SendItemCommand(virusItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + } + } + } + } + + private void FinishedAttack() + { + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + State = PlayerState.Normal; + attackTween.Stop(); + /* + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + targetPlayer = null; + PathToPlayer(); + return; + } + + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) + { + attackTimer.Start(AttackWait, CheckAttackTarget); + } + else + { + targetPlayer = null; + PathToPlayer(); + } + */ + } } diff --git a/Assets/Player/Player.prefab b/Assets/Player/Player.prefab index f0c3aec..457b3f3 100644 --- a/Assets/Player/Player.prefab +++ b/Assets/Player/Player.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &343309219727595444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2598280723270433121} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2598280723270433121 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343309219727595444} + 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_Children: + - {fileID: 1845617020995435930} + m_Father: {fileID: 1845617020408148629} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1845617019273958011 MonoBehaviour: m_ObjectHideFlags: 0 @@ -24,6 +55,7 @@ - component: {fileID: 2647236827943958594} - component: {fileID: 8076821645923605816} - component: {fileID: 446445004819590403} + - component: {fileID: 7181779030893752132} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -43,7 +75,7 @@ m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1845617019273958005} - - {fileID: 1845617020995435930} + - {fileID: 2598280723270433121} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -80,13 +112,19 @@ m_EditorClassIdentifier: ForceLocal: 0 DefaultMaxHealth: 1 + MeshRoot: {fileID: 343309219727595444} PlayerMesh: {fileID: 1845617020995435925} Speed: 8 MoveTouchFullZone: 0.6 MoveTouchRadiusSize: 1.45 - DefaultViewRadius: 5.5 + AttackTouchRadiusSize: 1.45 + DefaultViewRadius: 4.8 CamFollowAmount: 0.9 SpotFollowAmount: 0.96 + AttackTime: 0.2 + AttackDist: 2 + Damage: 1 + AttackWait: 0.8 --- !u!143 &446445004819590403 CharacterController: m_ObjectHideFlags: 0 @@ -105,6 +143,22 @@ m_SkinWidth: 0.08 m_MinMoveDistance: 0.001 m_Center: {x: 0, y: -0.26, z: 0} +--- !u!54 &7181779030893752132 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845617020408148631} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &1845617020995435925 GameObject: m_ObjectHideFlags: 0 @@ -131,12 +185,12 @@ m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1845617020995435925} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.61686, y: 0.61686, z: 0.61686} m_Children: [] - m_Father: {fileID: 1845617020408148629} - m_RootOrder: 1 + m_Father: {fileID: 2598280723270433121} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1845617020995435929 MeshFilter: @@ -194,7 +248,7 @@ m_GameObject: {fileID: 1845617020995435925} m_Material: {fileID: 0} m_IsTrigger: 1 - m_Enabled: 0 + m_Enabled: 1 serializedVersion: 2 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/Player/UIHookup.cs b/Assets/Player/UIHookup.cs index 7a6a21d..d5ad9a0 100644 --- a/Assets/Player/UIHookup.cs +++ b/Assets/Player/UIHookup.cs @@ -5,6 +5,7 @@ public class UIHookup : MonoBehaviour { public RectTransform MoveTouch; + public RectTransform AttackTouch; public Canvas MainCanvas; public RectTransform Health; diff --git a/Assets/Scenes/Lobby.unity b/Assets/Scenes/Lobby.unity index b8e76a1..f05679c 100644 --- a/Assets/Scenes/Lobby.unity +++ b/Assets/Scenes/Lobby.unity @@ -752,7 +752,7 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 519420028} m_LocalRotation: {x: 0.6219096, y: -0, z: -0, w: 0.7830891} - m_LocalPosition: {x: 1.88, y: 15.09, z: -4.1} + m_LocalPosition: {x: 1.88, y: 10.13, z: -2.5} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 1145059467} @@ -1128,7 +1128,7 @@ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 18.6} + m_AnchoredPosition: {x: 0, y: 18.599976} m_SizeDelta: {x: 650, y: 15.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &747122217 @@ -1423,6 +1423,79 @@ type: 3} m_PrefabInstance: {fileID: 1071739189} m_PrefabAsset: {fileID: 0} +--- !u!1 &1086344763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1086344764} + - component: {fileID: 1086344766} + - component: {fileID: 1086344765} + m_Layer: 5 + m_Name: Attack + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1086344764 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.7835172, y: 1.7835172, z: 1.7835172} + m_Children: [] + m_Father: {fileID: 2078452658} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -101, y: 96} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1086344765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ec3edcde9ec42984889460ab3fa54616, type: 3} + m_Type: 0 + 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 &1086344766 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + m_CullTransparentMesh: 0 --- !u!1 &1088763451 GameObject: m_ObjectHideFlags: 0 @@ -1526,7 +1599,7 @@ m_Component: - component: {fileID: 1145059467} m_Layer: 0 - m_Name: GameObject + m_Name: CameraHolder m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2272,7 +2345,6 @@ serializedVersion: 6 m_Component: - component: {fileID: 1917456052} - - component: {fileID: 1917456051} - component: {fileID: 1917456050} m_Layer: 0 m_Name: UIHookup @@ -2294,23 +2366,9 @@ m_Name: m_EditorClassIdentifier: MoveTouch: {fileID: 1731919963} + AttackTouch: {fileID: 1086344764} MainCanvas: {fileID: 2078452657} Health: {fileID: 747122216} ---- !u!114 &1917456051 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1917456049} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b8368d89d0c587f45aefff388426bd1f, type: 3} - m_Name: - m_EditorClassIdentifier: - MoveTouch: {fileID: 0} - MainCanvas: {fileID: 0} - Health: {fileID: 0} --- !u!4 &1917456052 Transform: m_ObjectHideFlags: 0 @@ -2702,6 +2760,7 @@ m_Children: - {fileID: 747122216} - {fileID: 1731919963} + - {fileID: 1086344764} m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/UI/TouchAttack.png b/Assets/UI/TouchAttack.png new file mode 100644 index 0000000..db83fc2 --- /dev/null +++ b/Assets/UI/TouchAttack.png Binary files differ diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.prefab b/Assets/Gameplay/Virus.prefab index 66504a4..e272c3b 100644 --- a/Assets/Gameplay/Virus.prefab +++ b/Assets/Gameplay/Virus.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2952408664780834224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4441512792082825468} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4441512792082825468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2952408664780834224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.013, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1498328307549180055} + m_Father: {fileID: 4145560279359410844} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6787116220008065685 GameObject: m_ObjectHideFlags: 0 @@ -27,10 +58,10 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6787116220008065685} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 1.22, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.43849, y: 0.43849, z: 0.43849} m_Children: [] - m_Father: {fileID: 4145560279359410844} + m_Father: {fileID: 4441512792082825468} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1980325977259363779 @@ -91,7 +122,7 @@ m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Radius: 0.55 m_Center: {x: 0, y: 0, z: 0} --- !u!1 &6877406027520012927 GameObject: @@ -105,6 +136,7 @@ - component: {fileID: 7496028867877103345} - component: {fileID: 8566340932116108959} - component: {fileID: 3276850821974423095} + - component: {fileID: 705066569827785281} m_Layer: 0 m_Name: Virus m_TagString: Untagged @@ -123,7 +155,7 @@ m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1498328307549180055} + - {fileID: 4441512792082825468} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -158,11 +190,14 @@ m_Script: {fileID: 11500000, guid: 54c3bb2bb08c27d4f991767e7847767a, type: 3} m_Name: m_EditorClassIdentifier: + MeshRoot: {fileID: 2952408664780834224} AttackMaxDist: 1.8 + RepathTime: 1.3 AttackTime: 0.2 AttackDistMult: 1.3 - Damage: 0.4 + Damage: 0.11 AttackWait: 0.8 + MinDamageDist: 0.6 --- !u!195 &3276850821974423095 NavMeshAgent: m_ObjectHideFlags: 0 @@ -185,3 +220,19 @@ m_BaseOffset: 0 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 +--- !u!54 &705066569827785281 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6877406027520012927} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Player/Player.cs b/Assets/Player/Player.cs index 42a65d0..3763c81 100644 --- a/Assets/Player/Player.cs +++ b/Assets/Player/Player.cs @@ -34,6 +34,18 @@ private float maxHealth = 0; private float health = 0; + public GameObject MeshRoot; + + public enum PlayerState + { + Remote, + Normal, + Attacking, + Dead + } + + public PlayerState State { get; private set; } + // Start is called before the first frame update void Awake() { @@ -42,6 +54,8 @@ netItem = GetComponentInChildren(); castLight = transform.Find("CastLight").gameObject; + if (attackTween == null) attackTween = new SimpleTween(); + uiHookup = FindObjectOfType(); if (ForceLocal) @@ -50,6 +64,8 @@ } viewRadius = DefaultViewRadius; + + State = PlayerState.Remote; } public GameObject PlayerMesh; @@ -59,6 +75,8 @@ public float BottomOffset { get { return bottomOffset; } } void StartLocal() { + State = PlayerState.Normal; + maxHealth = DefaultMaxHealth; health = DefaultMaxHealth; castLight.SetActive(true); @@ -133,6 +151,7 @@ private void OnDestroy() { shiftTween.Stop(); + attackTween.Stop(); } void StartRemote() @@ -160,6 +179,8 @@ public float MoveTouchFullZone = 0.7f; public float MoveTouchRadiusSize = 1.45f; + public float AttackTouchRadiusSize = 1.45f; + public float DefaultViewRadius = 5.5f; private float viewRadius; @@ -182,6 +203,8 @@ return current; } + private bool touchInAttack = false; + // Update is called once per frame void Update() { @@ -216,9 +239,9 @@ wantMove.Normalize(); - if (uiHookup != null && uiHookup.MoveTouch != null && uiHookup.MainCanvas != null) + if (uiHookup != null && uiHookup.MainCanvas != null) { - float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; + touches.Clear(); touches.AddRange(Input.touches); @@ -228,14 +251,39 @@ touches.Add(new Touch { position = Input.mousePosition }); } + bool wasInAttackTouch = touchInAttack; + touchInAttack = false; + foreach (Touch touch in touches) { + // movement touch + float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; Vector2 diff = new Vector2(); RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.MoveTouch, touch.position, null, out diff); if (diff.magnitude < radius) { wantMove = new Vector3(diff.x, 0, diff.y) / (radius * MoveTouchFullZone); if (wantMove.magnitude > 1) wantMove.Normalize(); + + break; + } + } + + foreach (Touch touch in touches) + { + float radius = uiHookup.AttackTouch.rect.width * 0.5f * AttackTouchRadiusSize; + Vector2 diff = new Vector2(); + RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.AttackTouch, touch.position, null, out diff); + if (diff.magnitude < radius && diff.magnitude > 0.2f) + { + if (!wasInAttackTouch && State == PlayerState.Normal) + { + Attack(new Vector3(diff.x, 0, diff.y)); + } + + touchInAttack = true; + + break; } } } @@ -258,7 +306,7 @@ } - if (wantMove.sqrMagnitude > 0) + if (wantMove.sqrMagnitude > 0 && State == PlayerState.Normal) { wantMove *= Speed * Time.deltaTime; wantMove.y = -0.1f * Time.deltaTime; @@ -270,4 +318,84 @@ } } + private SimpleTween attackTween; + + public float AttackTime = 0.2f; + public float AttackDist = 2f; + + public float Damage = 1f; + + + + private Vector3 attackDelta; + + private Vector3 lastAttackPos; + + private void Attack(Vector3 attackDir) + { + State = PlayerState.Attacking; + + attackDelta = attackDir.normalized * AttackDist; + + Vector3 startPos = transform.position; + lastAttackPos = startPos; + attackTween.Init( + v => + { + lastAttackPos = transform.position; + transform.position = startPos + attackDelta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + + attackTween.OnFinish = FinishedAttack; + } + + public float AttackWait = 0.8f; + + void OnTriggerEnter(Collider other) + { + if (State == PlayerState.Attacking) + { + Virus v = other.GetComponentInParent(); + if (v == null) + { + transform.position = lastAttackPos; + FinishedAttack(); + } + else + { + Item virusItem = v.GetComponentInChildren(); + if (virusItem != null && netItem.GetNetHost() != null) + { + netItem.GetNetHost().SendItemCommand(virusItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + } + } + } + } + + private void FinishedAttack() + { + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + State = PlayerState.Normal; + attackTween.Stop(); + /* + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + targetPlayer = null; + PathToPlayer(); + return; + } + + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) + { + attackTimer.Start(AttackWait, CheckAttackTarget); + } + else + { + targetPlayer = null; + PathToPlayer(); + } + */ + } } diff --git a/Assets/Player/Player.prefab b/Assets/Player/Player.prefab index f0c3aec..457b3f3 100644 --- a/Assets/Player/Player.prefab +++ b/Assets/Player/Player.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &343309219727595444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2598280723270433121} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2598280723270433121 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343309219727595444} + 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_Children: + - {fileID: 1845617020995435930} + m_Father: {fileID: 1845617020408148629} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1845617019273958011 MonoBehaviour: m_ObjectHideFlags: 0 @@ -24,6 +55,7 @@ - component: {fileID: 2647236827943958594} - component: {fileID: 8076821645923605816} - component: {fileID: 446445004819590403} + - component: {fileID: 7181779030893752132} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -43,7 +75,7 @@ m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1845617019273958005} - - {fileID: 1845617020995435930} + - {fileID: 2598280723270433121} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -80,13 +112,19 @@ m_EditorClassIdentifier: ForceLocal: 0 DefaultMaxHealth: 1 + MeshRoot: {fileID: 343309219727595444} PlayerMesh: {fileID: 1845617020995435925} Speed: 8 MoveTouchFullZone: 0.6 MoveTouchRadiusSize: 1.45 - DefaultViewRadius: 5.5 + AttackTouchRadiusSize: 1.45 + DefaultViewRadius: 4.8 CamFollowAmount: 0.9 SpotFollowAmount: 0.96 + AttackTime: 0.2 + AttackDist: 2 + Damage: 1 + AttackWait: 0.8 --- !u!143 &446445004819590403 CharacterController: m_ObjectHideFlags: 0 @@ -105,6 +143,22 @@ m_SkinWidth: 0.08 m_MinMoveDistance: 0.001 m_Center: {x: 0, y: -0.26, z: 0} +--- !u!54 &7181779030893752132 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845617020408148631} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &1845617020995435925 GameObject: m_ObjectHideFlags: 0 @@ -131,12 +185,12 @@ m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1845617020995435925} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.61686, y: 0.61686, z: 0.61686} m_Children: [] - m_Father: {fileID: 1845617020408148629} - m_RootOrder: 1 + m_Father: {fileID: 2598280723270433121} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1845617020995435929 MeshFilter: @@ -194,7 +248,7 @@ m_GameObject: {fileID: 1845617020995435925} m_Material: {fileID: 0} m_IsTrigger: 1 - m_Enabled: 0 + m_Enabled: 1 serializedVersion: 2 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/Player/UIHookup.cs b/Assets/Player/UIHookup.cs index 7a6a21d..d5ad9a0 100644 --- a/Assets/Player/UIHookup.cs +++ b/Assets/Player/UIHookup.cs @@ -5,6 +5,7 @@ public class UIHookup : MonoBehaviour { public RectTransform MoveTouch; + public RectTransform AttackTouch; public Canvas MainCanvas; public RectTransform Health; diff --git a/Assets/Scenes/Lobby.unity b/Assets/Scenes/Lobby.unity index b8e76a1..f05679c 100644 --- a/Assets/Scenes/Lobby.unity +++ b/Assets/Scenes/Lobby.unity @@ -752,7 +752,7 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 519420028} m_LocalRotation: {x: 0.6219096, y: -0, z: -0, w: 0.7830891} - m_LocalPosition: {x: 1.88, y: 15.09, z: -4.1} + m_LocalPosition: {x: 1.88, y: 10.13, z: -2.5} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 1145059467} @@ -1128,7 +1128,7 @@ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 18.6} + m_AnchoredPosition: {x: 0, y: 18.599976} m_SizeDelta: {x: 650, y: 15.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &747122217 @@ -1423,6 +1423,79 @@ type: 3} m_PrefabInstance: {fileID: 1071739189} m_PrefabAsset: {fileID: 0} +--- !u!1 &1086344763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1086344764} + - component: {fileID: 1086344766} + - component: {fileID: 1086344765} + m_Layer: 5 + m_Name: Attack + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1086344764 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.7835172, y: 1.7835172, z: 1.7835172} + m_Children: [] + m_Father: {fileID: 2078452658} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -101, y: 96} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1086344765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ec3edcde9ec42984889460ab3fa54616, type: 3} + m_Type: 0 + 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 &1086344766 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + m_CullTransparentMesh: 0 --- !u!1 &1088763451 GameObject: m_ObjectHideFlags: 0 @@ -1526,7 +1599,7 @@ m_Component: - component: {fileID: 1145059467} m_Layer: 0 - m_Name: GameObject + m_Name: CameraHolder m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2272,7 +2345,6 @@ serializedVersion: 6 m_Component: - component: {fileID: 1917456052} - - component: {fileID: 1917456051} - component: {fileID: 1917456050} m_Layer: 0 m_Name: UIHookup @@ -2294,23 +2366,9 @@ m_Name: m_EditorClassIdentifier: MoveTouch: {fileID: 1731919963} + AttackTouch: {fileID: 1086344764} MainCanvas: {fileID: 2078452657} Health: {fileID: 747122216} ---- !u!114 &1917456051 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1917456049} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b8368d89d0c587f45aefff388426bd1f, type: 3} - m_Name: - m_EditorClassIdentifier: - MoveTouch: {fileID: 0} - MainCanvas: {fileID: 0} - Health: {fileID: 0} --- !u!4 &1917456052 Transform: m_ObjectHideFlags: 0 @@ -2702,6 +2760,7 @@ m_Children: - {fileID: 747122216} - {fileID: 1731919963} + - {fileID: 1086344764} m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/UI/TouchAttack.png b/Assets/UI/TouchAttack.png new file mode 100644 index 0000000..db83fc2 --- /dev/null +++ b/Assets/UI/TouchAttack.png Binary files differ diff --git a/Assets/UI/TouchAttack.png.meta b/Assets/UI/TouchAttack.png.meta new file mode 100644 index 0000000..04f4410 --- /dev/null +++ b/Assets/UI/TouchAttack.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: ec3edcde9ec42984889460ab3fa54616 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 1 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Gameplay/Virus.cs b/Assets/Gameplay/Virus.cs index 8e87654..a8295ea 100644 --- a/Assets/Gameplay/Virus.cs +++ b/Assets/Gameplay/Virus.cs @@ -18,6 +18,8 @@ attackTween = new SimpleTween(); attackTimer = new SimpleTimer(); } + + public GameObject MeshRoot; // Start is called before the first frame update void Start() @@ -152,8 +154,20 @@ } } + void TakeDamage(object detailsObj) + { + Dictionary details = detailsObj as Dictionary; + + if (details != null && details.ContainsKey("damage")) + { + item.DestroyItem(); + } + } + void OnDestroy() { + attacking = false; + damaged.Clear(); attackTween.Stop(); repathTimer.Stop(); attackTimer.Stop(); @@ -170,18 +184,48 @@ Vector3 delta = TargetBasePos - startPos; delta *= AttackDistMult; + if (delta.magnitude < AttackMaxDist * 0.4f) + { + delta = delta.normalized * AttackMaxDist * 0.4f; + } - attackTween.Init(v => transform.position = startPos + delta * v, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + attacking = true; + damaged.Clear(); + + attackTween.Init( + v => + { + transform.position = startPos + delta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); attackTween.OnFinish = FinishedAttack; - attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); + //attackTimer.Start(AttackTime / AttackDistMult, DamageTarget); } public float AttackWait = 0.8f; + private bool attacking = false; + private List damaged = new List(); private void FinishedAttack() { + attacking = false; + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + + if (damagedAny) + { + item.DestroyItem(); + } + + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + attackTimer.Start(0.3f, PathToPlayer); + targetPlayer = null; + return; + } + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) { attackTimer.Start(AttackWait, CheckAttackTarget); @@ -205,15 +249,28 @@ PathToPlayer(); } } - private void DamageTarget() + private bool damagedAny = false; + void OnTriggerEnter(Collider other) { - if (targetPlayer != null) + Player p = other.GetComponentInParent(); + if (p != null && !damaged.Contains(p) && attacking) { - Item playerItem = targetPlayer.GetComponentInChildren(); - if (playerItem != null && item != null && item.GetNetHost() != null) - { - item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); - } + DamagePlayer(p); } } + + public float MinDamageDist = 0.6f; + private void DamagePlayer(Player p) + { + //if (targetPlayer != null && DistToTarget < MinDamageDist) + //{ + damaged.Add(p); + Item playerItem = p.GetComponentInChildren(); + if (playerItem != null && item != null && item.GetNetHost() != null) + { + item.GetNetHost().SendItemCommand(playerItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + damagedAny = true; + } + //} + } } diff --git a/Assets/Gameplay/Virus.prefab b/Assets/Gameplay/Virus.prefab index 66504a4..e272c3b 100644 --- a/Assets/Gameplay/Virus.prefab +++ b/Assets/Gameplay/Virus.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2952408664780834224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4441512792082825468} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4441512792082825468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2952408664780834224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.013, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1498328307549180055} + m_Father: {fileID: 4145560279359410844} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6787116220008065685 GameObject: m_ObjectHideFlags: 0 @@ -27,10 +58,10 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6787116220008065685} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 1.22, z: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.43849, y: 0.43849, z: 0.43849} m_Children: [] - m_Father: {fileID: 4145560279359410844} + m_Father: {fileID: 4441512792082825468} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1980325977259363779 @@ -91,7 +122,7 @@ m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Radius: 0.55 m_Center: {x: 0, y: 0, z: 0} --- !u!1 &6877406027520012927 GameObject: @@ -105,6 +136,7 @@ - component: {fileID: 7496028867877103345} - component: {fileID: 8566340932116108959} - component: {fileID: 3276850821974423095} + - component: {fileID: 705066569827785281} m_Layer: 0 m_Name: Virus m_TagString: Untagged @@ -123,7 +155,7 @@ m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1498328307549180055} + - {fileID: 4441512792082825468} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -158,11 +190,14 @@ m_Script: {fileID: 11500000, guid: 54c3bb2bb08c27d4f991767e7847767a, type: 3} m_Name: m_EditorClassIdentifier: + MeshRoot: {fileID: 2952408664780834224} AttackMaxDist: 1.8 + RepathTime: 1.3 AttackTime: 0.2 AttackDistMult: 1.3 - Damage: 0.4 + Damage: 0.11 AttackWait: 0.8 + MinDamageDist: 0.6 --- !u!195 &3276850821974423095 NavMeshAgent: m_ObjectHideFlags: 0 @@ -185,3 +220,19 @@ m_BaseOffset: 0 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 +--- !u!54 &705066569827785281 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6877406027520012927} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Player/Player.cs b/Assets/Player/Player.cs index 42a65d0..3763c81 100644 --- a/Assets/Player/Player.cs +++ b/Assets/Player/Player.cs @@ -34,6 +34,18 @@ private float maxHealth = 0; private float health = 0; + public GameObject MeshRoot; + + public enum PlayerState + { + Remote, + Normal, + Attacking, + Dead + } + + public PlayerState State { get; private set; } + // Start is called before the first frame update void Awake() { @@ -42,6 +54,8 @@ netItem = GetComponentInChildren(); castLight = transform.Find("CastLight").gameObject; + if (attackTween == null) attackTween = new SimpleTween(); + uiHookup = FindObjectOfType(); if (ForceLocal) @@ -50,6 +64,8 @@ } viewRadius = DefaultViewRadius; + + State = PlayerState.Remote; } public GameObject PlayerMesh; @@ -59,6 +75,8 @@ public float BottomOffset { get { return bottomOffset; } } void StartLocal() { + State = PlayerState.Normal; + maxHealth = DefaultMaxHealth; health = DefaultMaxHealth; castLight.SetActive(true); @@ -133,6 +151,7 @@ private void OnDestroy() { shiftTween.Stop(); + attackTween.Stop(); } void StartRemote() @@ -160,6 +179,8 @@ public float MoveTouchFullZone = 0.7f; public float MoveTouchRadiusSize = 1.45f; + public float AttackTouchRadiusSize = 1.45f; + public float DefaultViewRadius = 5.5f; private float viewRadius; @@ -182,6 +203,8 @@ return current; } + private bool touchInAttack = false; + // Update is called once per frame void Update() { @@ -216,9 +239,9 @@ wantMove.Normalize(); - if (uiHookup != null && uiHookup.MoveTouch != null && uiHookup.MainCanvas != null) + if (uiHookup != null && uiHookup.MainCanvas != null) { - float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; + touches.Clear(); touches.AddRange(Input.touches); @@ -228,14 +251,39 @@ touches.Add(new Touch { position = Input.mousePosition }); } + bool wasInAttackTouch = touchInAttack; + touchInAttack = false; + foreach (Touch touch in touches) { + // movement touch + float radius = uiHookup.MoveTouch.rect.width * 0.5f * MoveTouchRadiusSize; Vector2 diff = new Vector2(); RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.MoveTouch, touch.position, null, out diff); if (diff.magnitude < radius) { wantMove = new Vector3(diff.x, 0, diff.y) / (radius * MoveTouchFullZone); if (wantMove.magnitude > 1) wantMove.Normalize(); + + break; + } + } + + foreach (Touch touch in touches) + { + float radius = uiHookup.AttackTouch.rect.width * 0.5f * AttackTouchRadiusSize; + Vector2 diff = new Vector2(); + RectTransformUtility.ScreenPointToLocalPointInRectangle(uiHookup.AttackTouch, touch.position, null, out diff); + if (diff.magnitude < radius && diff.magnitude > 0.2f) + { + if (!wasInAttackTouch && State == PlayerState.Normal) + { + Attack(new Vector3(diff.x, 0, diff.y)); + } + + touchInAttack = true; + + break; } } } @@ -258,7 +306,7 @@ } - if (wantMove.sqrMagnitude > 0) + if (wantMove.sqrMagnitude > 0 && State == PlayerState.Normal) { wantMove *= Speed * Time.deltaTime; wantMove.y = -0.1f * Time.deltaTime; @@ -270,4 +318,84 @@ } } + private SimpleTween attackTween; + + public float AttackTime = 0.2f; + public float AttackDist = 2f; + + public float Damage = 1f; + + + + private Vector3 attackDelta; + + private Vector3 lastAttackPos; + + private void Attack(Vector3 attackDir) + { + State = PlayerState.Attacking; + + attackDelta = attackDir.normalized * AttackDist; + + Vector3 startPos = transform.position; + lastAttackPos = startPos; + attackTween.Init( + v => + { + lastAttackPos = transform.position; + transform.position = startPos + attackDelta * v; + MeshRoot.transform.localScale = new Vector3(1, 1, 1) * (v * 0.3f + 1.0f); + }, SimpleTween.QuadEaseOut, 0, 1, AttackTime); + + attackTween.OnFinish = FinishedAttack; + } + + public float AttackWait = 0.8f; + + void OnTriggerEnter(Collider other) + { + if (State == PlayerState.Attacking) + { + Virus v = other.GetComponentInParent(); + if (v == null) + { + transform.position = lastAttackPos; + FinishedAttack(); + } + else + { + Item virusItem = v.GetComponentInChildren(); + if (virusItem != null && netItem.GetNetHost() != null) + { + netItem.GetNetHost().SendItemCommand(virusItem.Key, "TakeDamage", new Dictionary { { "damage", Damage } }); + } + } + } + } + + private void FinishedAttack() + { + MeshRoot.transform.localScale = new Vector3(1, 1, 1); + State = PlayerState.Normal; + attackTween.Stop(); + /* + if (UnityEngine.Random.Range(0, 1) < 0.4f) + { + targetPlayer = null; + PathToPlayer(); + return; + } + + + if (targetPlayer != null && DistToTarget <= AttackMaxDist) + { + attackTimer.Start(AttackWait, CheckAttackTarget); + } + else + { + targetPlayer = null; + PathToPlayer(); + } + */ + } } diff --git a/Assets/Player/Player.prefab b/Assets/Player/Player.prefab index f0c3aec..457b3f3 100644 --- a/Assets/Player/Player.prefab +++ b/Assets/Player/Player.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &343309219727595444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2598280723270433121} + m_Layer: 0 + m_Name: MeshRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2598280723270433121 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 343309219727595444} + 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_Children: + - {fileID: 1845617020995435930} + m_Father: {fileID: 1845617020408148629} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1845617019273958011 MonoBehaviour: m_ObjectHideFlags: 0 @@ -24,6 +55,7 @@ - component: {fileID: 2647236827943958594} - component: {fileID: 8076821645923605816} - component: {fileID: 446445004819590403} + - component: {fileID: 7181779030893752132} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -43,7 +75,7 @@ m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1845617019273958005} - - {fileID: 1845617020995435930} + - {fileID: 2598280723270433121} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -80,13 +112,19 @@ m_EditorClassIdentifier: ForceLocal: 0 DefaultMaxHealth: 1 + MeshRoot: {fileID: 343309219727595444} PlayerMesh: {fileID: 1845617020995435925} Speed: 8 MoveTouchFullZone: 0.6 MoveTouchRadiusSize: 1.45 - DefaultViewRadius: 5.5 + AttackTouchRadiusSize: 1.45 + DefaultViewRadius: 4.8 CamFollowAmount: 0.9 SpotFollowAmount: 0.96 + AttackTime: 0.2 + AttackDist: 2 + Damage: 1 + AttackWait: 0.8 --- !u!143 &446445004819590403 CharacterController: m_ObjectHideFlags: 0 @@ -105,6 +143,22 @@ m_SkinWidth: 0.08 m_MinMoveDistance: 0.001 m_Center: {x: 0, y: -0.26, z: 0} +--- !u!54 &7181779030893752132 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845617020408148631} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &1845617020995435925 GameObject: m_ObjectHideFlags: 0 @@ -131,12 +185,12 @@ m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1845617020995435925} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.61686, y: 0.61686, z: 0.61686} m_Children: [] - m_Father: {fileID: 1845617020408148629} - m_RootOrder: 1 + m_Father: {fileID: 2598280723270433121} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &1845617020995435929 MeshFilter: @@ -194,7 +248,7 @@ m_GameObject: {fileID: 1845617020995435925} m_Material: {fileID: 0} m_IsTrigger: 1 - m_Enabled: 0 + m_Enabled: 1 serializedVersion: 2 m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/Player/UIHookup.cs b/Assets/Player/UIHookup.cs index 7a6a21d..d5ad9a0 100644 --- a/Assets/Player/UIHookup.cs +++ b/Assets/Player/UIHookup.cs @@ -5,6 +5,7 @@ public class UIHookup : MonoBehaviour { public RectTransform MoveTouch; + public RectTransform AttackTouch; public Canvas MainCanvas; public RectTransform Health; diff --git a/Assets/Scenes/Lobby.unity b/Assets/Scenes/Lobby.unity index b8e76a1..f05679c 100644 --- a/Assets/Scenes/Lobby.unity +++ b/Assets/Scenes/Lobby.unity @@ -752,7 +752,7 @@ m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 519420028} m_LocalRotation: {x: 0.6219096, y: -0, z: -0, w: 0.7830891} - m_LocalPosition: {x: 1.88, y: 15.09, z: -4.1} + m_LocalPosition: {x: 1.88, y: 10.13, z: -2.5} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 1145059467} @@ -1128,7 +1128,7 @@ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 18.6} + m_AnchoredPosition: {x: 0, y: 18.599976} m_SizeDelta: {x: 650, y: 15.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &747122217 @@ -1423,6 +1423,79 @@ type: 3} m_PrefabInstance: {fileID: 1071739189} m_PrefabAsset: {fileID: 0} +--- !u!1 &1086344763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1086344764} + - component: {fileID: 1086344766} + - component: {fileID: 1086344765} + m_Layer: 5 + m_Name: Attack + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1086344764 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.7835172, y: 1.7835172, z: 1.7835172} + m_Children: [] + m_Father: {fileID: 2078452658} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -101, y: 96} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1086344765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + 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: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ec3edcde9ec42984889460ab3fa54616, type: 3} + m_Type: 0 + 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 &1086344766 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1086344763} + m_CullTransparentMesh: 0 --- !u!1 &1088763451 GameObject: m_ObjectHideFlags: 0 @@ -1526,7 +1599,7 @@ m_Component: - component: {fileID: 1145059467} m_Layer: 0 - m_Name: GameObject + m_Name: CameraHolder m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2272,7 +2345,6 @@ serializedVersion: 6 m_Component: - component: {fileID: 1917456052} - - component: {fileID: 1917456051} - component: {fileID: 1917456050} m_Layer: 0 m_Name: UIHookup @@ -2294,23 +2366,9 @@ m_Name: m_EditorClassIdentifier: MoveTouch: {fileID: 1731919963} + AttackTouch: {fileID: 1086344764} MainCanvas: {fileID: 2078452657} Health: {fileID: 747122216} ---- !u!114 &1917456051 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1917456049} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b8368d89d0c587f45aefff388426bd1f, type: 3} - m_Name: - m_EditorClassIdentifier: - MoveTouch: {fileID: 0} - MainCanvas: {fileID: 0} - Health: {fileID: 0} --- !u!4 &1917456052 Transform: m_ObjectHideFlags: 0 @@ -2702,6 +2760,7 @@ m_Children: - {fileID: 747122216} - {fileID: 1731919963} + - {fileID: 1086344764} m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/UI/TouchAttack.png b/Assets/UI/TouchAttack.png new file mode 100644 index 0000000..db83fc2 --- /dev/null +++ b/Assets/UI/TouchAttack.png Binary files differ diff --git a/Assets/UI/TouchAttack.png.meta b/Assets/UI/TouchAttack.png.meta new file mode 100644 index 0000000..04f4410 --- /dev/null +++ b/Assets/UI/TouchAttack.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: ec3edcde9ec42984889460ab3fa54616 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 1 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset index 4654e13..71c9e0f 100755 --- a/ProjectSettings/GraphicsSettings.asset +++ b/ProjectSettings/GraphicsSettings.asset @@ -34,6 +34,7 @@ - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 16003, guid: 0000000000000000f000000000000000, type: 0} m_PreloadedShaders: [] m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}