First version of build system

This commit is contained in:
Stedd 2022-09-18 14:26:00 +02:00
parent 4034c1e122
commit 15e1e06dfe
18 changed files with 346 additions and 68 deletions

View File

@ -409,7 +409,8 @@ MonoBehaviour:
health: 0
maxHealth: 0
isInvulnerable: 0
_centerPosition: {fileID: 3291032053430181389}
centerPosition: {fileID: 3291032053430181389}
basePosition: {fileID: 2692714622321691895}
--- !u!1 &6940800288144322101
GameObject:
m_ObjectHideFlags: 0

View File

@ -5,12 +5,6 @@ namespace AsteroidGame.Entities.Enemies.Scripts
{
public class EnemyBase : EntityBase
{
[Header("Connections")]
[SerializeField] private Transform _centerPosition;
public Vector3 GetCenterPosition()
{
return _centerPosition.transform.position;
}
}
}

View File

@ -3,14 +3,24 @@ using UnityEngine;
namespace AsteroidGame.Entities
{
public class EntityBase : MonoBehaviour, IDamageable
public class EntityBase : MonoBehaviour, IDamageable, ITargetable
{
[Header("Health")]
[SerializeField] protected int health;
[SerializeField] protected int maxHealth;
[SerializeField] protected bool isInvulnerable;
[Header("TargetPositions")]
[SerializeField] private Transform centerPosition;
[SerializeField] private Transform basePosition;
#region Props
public bool IsInvulnerable => isInvulnerable;
#endregion
#region Methods
public void ModifyHealth(int healthChange)
{
if (!isInvulnerable)
@ -19,6 +29,9 @@ namespace AsteroidGame.Entities
}
}
#endregion
#region Setters
public void SetHealth(int newHealth)
{
health = newHealth;
@ -34,6 +47,19 @@ namespace AsteroidGame.Entities
isInvulnerable = newState;
}
#endregion
#region Getters
public Vector3 GetCenterPosition()
{
return centerPosition.transform.position;
}
public Vector3 GetBasePosition()
{
return basePosition.transform.position;
}
public int GetHealth()
{
return health;
@ -49,5 +75,7 @@ namespace AsteroidGame.Entities
// ReSharper disable once PossibleLossOfFraction
return health / maxHealth;
}
#endregion
}
}

View File

@ -1,20 +1,45 @@
using System;
using System.Collections;
using AsteroidGame.Interfaces;
using UnityEngine;
namespace AsteroidGame.Entities.Structures.Scripts
{
public class StructureBase : EntityBase
public class StructureBase : EntityBase, IBuildable
{
[Header("BuildParameters")]
[SerializeField]
protected int cost;
[SerializeField] private bool _buildPlacementBlocked;
[SerializeField] protected float buildTimer;
#region Private
#endregion
#region Publics
public bool BuildPlacementBlocked => _buildPlacementBlocked;
public string Name { get; set; }
public int Cost { get; set; }
#endregion
private void OnTriggerStay(Collider other)
{
if(other.name == "BuildCollider")
{
_buildPlacementBlocked = true;
}
}
private void OnTriggerExit(Collider other)
{
if(other.name == "BuildCollider")
{
_buildPlacementBlocked = false;
}
}
}
}

View File

@ -124,6 +124,22 @@ namespace AsteroidGame.Entities.Structures.Tower
// ShootProjectile(true);
// }
// }
// private void OnTriggerEnter(Collider other)
// {
// print($"TriggerEnter: {other.name}");
// // if(other.name == "BuildCollider")
// // {
// // _buildPlacementBlocked = true;
// // }
// }
//
// private void OnTriggerExit(Collider other)
// {
// print($"TriggerExit: {other.name}");
// // if(other.name == "BuildCollider")
// // {
// // _buildPlacementBlocked = false;
// // }
// }
}
}

View File

@ -689,7 +689,7 @@ BoxCollider:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8385032484663529878}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_IsTrigger: 1
m_Enabled: 1
serializedVersion: 2
m_Size: {x: 1, y: 1, z: 1}
@ -745,8 +745,12 @@ MonoBehaviour:
health: 50
maxHealth: 50
isInvulnerable: 0
centerPosition: {fileID: 5103935544759496321}
basePosition: {fileID: 8324879816836607384}
cost: 20
buildTimer: 1
buildCollider: {fileID: 0}
_buildPlacementBlocked: 0
weaponRange: 40
damage: 1
fireRate: 1

View File

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using AsteroidGame.Entities.Structures.Scripts;
using UnityEngine;
@ -7,21 +8,21 @@ namespace AsteroidGame.Handlers
{
public class BuildingHandler : HandlerBase
{
[Header("Connections")]
[SerializeField] private new Camera camera ;
[Header("Connections")] [SerializeField]
private new Camera camera;
[Header("State")]
[Header("State")] [SerializeField] private bool isBuilding;
[SerializeField] private int buildingSelector;
[Header("Prefabs")]
[SerializeField] private List<StructureBase> buildings = new();
[Header("Prefabs")] [SerializeField] private List<StructureBase> buildings = new();
#region Private
[SerializeField] private List<StructureBase> activeBuildings;
private Vector3 _tempVec;
private Plane _buildPlane;
private StructureBase _tempSb;
private StructureBase _ghostStructure;
#endregion
@ -29,27 +30,83 @@ namespace AsteroidGame.Handlers
protected override void OnEnable()
{
base.OnEnable();
_buildPlane = new Plane(Vector3.up, Vector3.zero);
activeBuildings.Clear();
camera = Camera.main;
}
protected override void OnClick(InputAction.CallbackContext a)
private void Update()
{
PlaceBuilding();
if (isBuilding)
{
_ghostStructure.transform.position = GetPlanePoint();
}
}
private void PlaceBuilding()
protected override void OnLeftClick(InputAction.CallbackContext context)
{
if (!isBuilding) return;
if (_ghostStructure.BuildPlacementBlocked) return;
DestroyGhostStructure();
SpawnStructure();
isBuilding = false;
}
protected override void OnRightClick(InputAction.CallbackContext context)
{
if (!isBuilding) return;
DestroyGhostStructure();
isBuilding = false;
}
protected override void OnBuild(InputAction.CallbackContext context)
{
isBuilding = true;
SpawnGhostStructure();
}
private void SpawnGhostStructure()
{
_ghostStructure = Instantiate(buildings[buildingSelector], GetPlanePoint(), Quaternion.identity, transform);
_ghostStructure.name = "GhostStructure";
var rb = _ghostStructure.gameObject.AddComponent<Rigidbody>();
rb.useGravity = false;
// foreach (var renderer in _ghostStructure.GetComponents<MeshRenderer>())
// {
// var color = renderer.material.color;
// var tempcolor = color;
// tempcolor.a = 0.1f;
// color = tempcolor;
// }
_ghostStructure.GetComponent<StructureBase>().enabled = false;
}
private void DestroyGhostStructure()
{
Destroy(_ghostStructure.gameObject);
}
private void SpawnStructure()
{
_tempSb = Instantiate(buildings[buildingSelector], GetPlanePoint(), Quaternion.identity, transform);
activeBuildings.Add(_tempSb);
}
private Vector3 GetPlanePoint()
{
_buildPlane = new Plane(Vector3.up, Vector3.zero);
Ray ray = camera.ScreenPointToRay(Mouse.current.position.ReadValue());
if (_buildPlane.Raycast(ray, out float distance))
{
_tempVec = ray.GetPoint(distance);
return ray.GetPoint(distance);
}
else
{
print("BuildPlaneNotHit");
return Vector3.zero;
}
_tempSb = Instantiate(buildings[buildingSelector], _tempVec, Quaternion.identity, transform);
activeBuildings.Add(_tempSb);
}
}
}

View File

@ -16,16 +16,30 @@ namespace AsteroidGame.Handlers
protected virtual void OnEnable()
{
_handlerControls.Player.Enable();
_handlerControls.Player.Click.performed += OnClick;
_handlerControls.Player.LeftClick.performed += OnLeftClick;
_handlerControls.Player.RightClick.performed += OnRightClick;
_handlerControls.Player.Build.performed += OnBuild;
}
protected virtual void OnDisable()
{
_handlerControls.Player.Click.performed -= OnClick;
_handlerControls.Player.LeftClick.performed -= OnLeftClick;
_handlerControls.Player.RightClick.performed -= OnRightClick;
_handlerControls.Player.Build.performed -= OnBuild;
_handlerControls.Player.Disable();
}
protected virtual void OnClick(InputAction.CallbackContext a)
protected virtual void OnLeftClick(InputAction.CallbackContext context)
{
}
protected virtual void OnRightClick(InputAction.CallbackContext context)
{
}
protected virtual void OnBuild(InputAction.CallbackContext context)
{
}

View File

@ -48,13 +48,31 @@ namespace AsteroidGame
""initialStateCheck"": true
},
{
""name"": ""Click"",
""name"": ""LeftClick"",
""type"": ""Button"",
""id"": ""c7463e6d-1380-4e73-9edf-f690e3eabd4e"",
""expectedControlType"": ""Button"",
""processors"": """",
""interactions"": """",
""initialStateCheck"": false
},
{
""name"": ""Build"",
""type"": ""Button"",
""id"": ""6e8d8fb8-b4a0-474e-987e-8df78202fc67"",
""expectedControlType"": ""Button"",
""processors"": """",
""interactions"": """",
""initialStateCheck"": false
},
{
""name"": ""RightClick"",
""type"": ""Button"",
""id"": ""ba97303e-0882-48d7-85fd-8b0d6d63b06f"",
""expectedControlType"": ""Button"",
""processors"": """",
""interactions"": """",
""initialStateCheck"": false
}
],
""bindings"": [
@ -230,7 +248,7 @@ namespace AsteroidGame
""interactions"": """",
""processors"": """",
""groups"": "";Gamepad"",
""action"": ""Click"",
""action"": ""LeftClick"",
""isComposite"": false,
""isPartOfComposite"": false
},
@ -241,7 +259,7 @@ namespace AsteroidGame
""interactions"": """",
""processors"": """",
""groups"": "";Keyboard&Mouse"",
""action"": ""Click"",
""action"": ""LeftClick"",
""isComposite"": false,
""isPartOfComposite"": false
},
@ -252,7 +270,7 @@ namespace AsteroidGame
""interactions"": """",
""processors"": """",
""groups"": "";Touch"",
""action"": ""Click"",
""action"": ""LeftClick"",
""isComposite"": false,
""isPartOfComposite"": false
},
@ -263,7 +281,7 @@ namespace AsteroidGame
""interactions"": """",
""processors"": """",
""groups"": ""Joystick"",
""action"": ""Click"",
""action"": ""LeftClick"",
""isComposite"": false,
""isPartOfComposite"": false
},
@ -274,7 +292,29 @@ namespace AsteroidGame
""interactions"": """",
""processors"": """",
""groups"": ""XR"",
""action"": ""Click"",
""action"": ""LeftClick"",
""isComposite"": false,
""isPartOfComposite"": false
},
{
""name"": """",
""id"": ""30b1502f-c336-426d-b92f-2abd2ee7ccf4"",
""path"": ""<Keyboard>/#(B)"",
""interactions"": """",
""processors"": """",
""groups"": """",
""action"": ""Build"",
""isComposite"": false,
""isPartOfComposite"": false
},
{
""name"": """",
""id"": ""4c4b3c9a-43eb-4688-975e-0058cad51008"",
""path"": ""<Mouse>/rightButton"",
""interactions"": """",
""processors"": """",
""groups"": """",
""action"": ""RightClick"",
""isComposite"": false,
""isPartOfComposite"": false
}
@ -864,7 +904,9 @@ namespace AsteroidGame
m_Player = asset.FindActionMap("Player", throwIfNotFound: true);
m_Player_Move = m_Player.FindAction("Move", throwIfNotFound: true);
m_Player_Look = m_Player.FindAction("Look", throwIfNotFound: true);
m_Player_Click = m_Player.FindAction("Click", throwIfNotFound: true);
m_Player_LeftClick = m_Player.FindAction("LeftClick", throwIfNotFound: true);
m_Player_Build = m_Player.FindAction("Build", throwIfNotFound: true);
m_Player_RightClick = m_Player.FindAction("RightClick", throwIfNotFound: true);
// UI
m_UI = asset.FindActionMap("UI", throwIfNotFound: true);
m_UI_Navigate = m_UI.FindAction("Navigate", throwIfNotFound: true);
@ -938,14 +980,18 @@ namespace AsteroidGame
private IPlayerActions m_PlayerActionsCallbackInterface;
private readonly InputAction m_Player_Move;
private readonly InputAction m_Player_Look;
private readonly InputAction m_Player_Click;
private readonly InputAction m_Player_LeftClick;
private readonly InputAction m_Player_Build;
private readonly InputAction m_Player_RightClick;
public struct PlayerActions
{
private @HandlerControls m_Wrapper;
public PlayerActions(@HandlerControls wrapper) { m_Wrapper = wrapper; }
public InputAction @Move => m_Wrapper.m_Player_Move;
public InputAction @Look => m_Wrapper.m_Player_Look;
public InputAction @Click => m_Wrapper.m_Player_Click;
public InputAction @LeftClick => m_Wrapper.m_Player_LeftClick;
public InputAction @Build => m_Wrapper.m_Player_Build;
public InputAction @RightClick => m_Wrapper.m_Player_RightClick;
public InputActionMap Get() { return m_Wrapper.m_Player; }
public void Enable() { Get().Enable(); }
public void Disable() { Get().Disable(); }
@ -961,9 +1007,15 @@ namespace AsteroidGame
@Look.started -= m_Wrapper.m_PlayerActionsCallbackInterface.OnLook;
@Look.performed -= m_Wrapper.m_PlayerActionsCallbackInterface.OnLook;
@Look.canceled -= m_Wrapper.m_PlayerActionsCallbackInterface.OnLook;
@Click.started -= m_Wrapper.m_PlayerActionsCallbackInterface.OnClick;
@Click.performed -= m_Wrapper.m_PlayerActionsCallbackInterface.OnClick;
@Click.canceled -= m_Wrapper.m_PlayerActionsCallbackInterface.OnClick;
@LeftClick.started -= m_Wrapper.m_PlayerActionsCallbackInterface.OnLeftClick;
@LeftClick.performed -= m_Wrapper.m_PlayerActionsCallbackInterface.OnLeftClick;
@LeftClick.canceled -= m_Wrapper.m_PlayerActionsCallbackInterface.OnLeftClick;
@Build.started -= m_Wrapper.m_PlayerActionsCallbackInterface.OnBuild;
@Build.performed -= m_Wrapper.m_PlayerActionsCallbackInterface.OnBuild;
@Build.canceled -= m_Wrapper.m_PlayerActionsCallbackInterface.OnBuild;
@RightClick.started -= m_Wrapper.m_PlayerActionsCallbackInterface.OnRightClick;
@RightClick.performed -= m_Wrapper.m_PlayerActionsCallbackInterface.OnRightClick;
@RightClick.canceled -= m_Wrapper.m_PlayerActionsCallbackInterface.OnRightClick;
}
m_Wrapper.m_PlayerActionsCallbackInterface = instance;
if (instance != null)
@ -974,9 +1026,15 @@ namespace AsteroidGame
@Look.started += instance.OnLook;
@Look.performed += instance.OnLook;
@Look.canceled += instance.OnLook;
@Click.started += instance.OnClick;
@Click.performed += instance.OnClick;
@Click.canceled += instance.OnClick;
@LeftClick.started += instance.OnLeftClick;
@LeftClick.performed += instance.OnLeftClick;
@LeftClick.canceled += instance.OnLeftClick;
@Build.started += instance.OnBuild;
@Build.performed += instance.OnBuild;
@Build.canceled += instance.OnBuild;
@RightClick.started += instance.OnRightClick;
@RightClick.performed += instance.OnRightClick;
@RightClick.canceled += instance.OnRightClick;
}
}
}
@ -1135,7 +1193,9 @@ namespace AsteroidGame
{
void OnMove(InputAction.CallbackContext context);
void OnLook(InputAction.CallbackContext context);
void OnClick(InputAction.CallbackContext context);
void OnLeftClick(InputAction.CallbackContext context);
void OnBuild(InputAction.CallbackContext context);
void OnRightClick(InputAction.CallbackContext context);
}
public interface IUIActions
{

View File

@ -1,5 +1,5 @@
{
"name": "AsteroidGame",
"name": "HandlerControls",
"maps": [
{
"name": "Player",
@ -24,13 +24,31 @@
"initialStateCheck": true
},
{
"name": "Click",
"name": "LeftClick",
"type": "Button",
"id": "c7463e6d-1380-4e73-9edf-f690e3eabd4e",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Build",
"type": "Button",
"id": "6e8d8fb8-b4a0-474e-987e-8df78202fc67",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "RightClick",
"type": "Button",
"id": "ba97303e-0882-48d7-85fd-8b0d6d63b06f",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
@ -206,7 +224,7 @@
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Click",
"action": "LeftClick",
"isComposite": false,
"isPartOfComposite": false
},
@ -217,7 +235,7 @@
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Click",
"action": "LeftClick",
"isComposite": false,
"isPartOfComposite": false
},
@ -228,7 +246,7 @@
"interactions": "",
"processors": "",
"groups": ";Touch",
"action": "Click",
"action": "LeftClick",
"isComposite": false,
"isPartOfComposite": false
},
@ -239,7 +257,7 @@
"interactions": "",
"processors": "",
"groups": "Joystick",
"action": "Click",
"action": "LeftClick",
"isComposite": false,
"isPartOfComposite": false
},
@ -250,7 +268,29 @@
"interactions": "",
"processors": "",
"groups": "XR",
"action": "Click",
"action": "LeftClick",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "30b1502f-c336-426d-b92f-2abd2ee7ccf4",
"path": "<Keyboard>/#(B)",
"interactions": "",
"processors": "",
"groups": "",
"action": "Build",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "4c4b3c9a-43eb-4688-975e-0058cad51008",
"path": "<Mouse>/rightButton",
"interactions": "",
"processors": "",
"groups": "",
"action": "RightClick",
"isComposite": false,
"isPartOfComposite": false
}

View File

@ -0,0 +1,7 @@
namespace AsteroidGame.Interfaces
{
public interface IBuildable
{
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 99361805272d7f6419384097857e2bd6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,11 @@
using UnityEngine;
namespace AsteroidGame.Interfaces
{
public interface ITargetable
{
public Vector3 GetCenterPosition();
public Vector3 GetBasePosition();
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3d338501124dcf349b3852a83d20dbe4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -23,7 +23,7 @@ Material:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: ColliderIndicators
m_Name: ColliderIndicator
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ValidKeywords:
- _DISABLE_SSR_TRANSPARENT

View File

@ -252,6 +252,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
camera: {fileID: 0}
isBuilding: 0
buildingSelector: 0
buildings:
- {fileID: 8787361557661825162, guid: 534f8d15e0c83c646887bebfda2bdfd6, type: 3}
@ -313,11 +314,6 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: c2b4fe01faa847f4b976b5539477e1ec, type: 3}
--- !u!1 &1494623308 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 8083988910325146965, guid: c2b4fe01faa847f4b976b5539477e1ec, type: 3}
m_PrefabInstance: {fileID: 1191794244}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &1715656625
PrefabInstance:
m_ObjectHideFlags: 0
@ -604,6 +600,10 @@ PrefabInstance:
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4256226406833302537, guid: 534f8d15e0c83c646887bebfda2bdfd6, type: 3}
propertyPath: m_IsTrigger
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8324879816836607384, guid: 534f8d15e0c83c646887bebfda2bdfd6, type: 3}
propertyPath: m_RootOrder
value: 1
@ -652,9 +652,6 @@ PrefabInstance:
propertyPath: m_Name
value: Turret
objectReference: {fileID: 0}
- target: {fileID: 8787361557661825162, guid: 534f8d15e0c83c646887bebfda2bdfd6, type: 3}
propertyPath: targetEnemy
value:
objectReference: {fileID: 1494623308}
m_RemovedComponents: []
m_RemovedComponents:
- {fileID: 1344974744014620977, guid: 534f8d15e0c83c646887bebfda2bdfd6, type: 3}
m_SourcePrefab: {fileID: 100100000, guid: 534f8d15e0c83c646887bebfda2bdfd6, type: 3}

View File

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=Targetable/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>