feat: 3D off-screen indicators for items&players, gravity changer objects

This commit is contained in:
Jakob Feldmann 2024-06-12 13:41:57 +02:00
parent c7154c1895
commit 68ecddd9ca
13 changed files with 441 additions and 123 deletions

View File

@ -1 +0,0 @@
{"asset":{"generator":"3D Builder","version":"2.0"},"scene":0,"scenes":[{"nodes":[0]}],"nodes":[{"children":[1,2]},{"mesh":0,"matrix":[1,0,0,0,0,-1.1920928955078125E-7,-0.99999988079071045,0,0,0.99999988079071045,-1.1920928955078125E-7,0,0,0,0,1]},{"mesh":1,"matrix":[37.501873016357422,0,0,0,0,-2.9802320611338473E-8,-0.24999995529651642,0,0,2.5001249313354492,-2.9803814527440409E-7,0,-0.75,-0.050000172108411789,-1.4842503070831299,1]}],"meshes":[{"primitives":[{"attributes":{"POSITION":0,"COLOR_0":1},"mode":4,"indices":2}]},{"primitives":[{"attributes":{"POSITION":3,"COLOR_0":4},"mode":4,"indices":5}]}],"accessors":[{"bufferView":0,"byteOffset":0,"count":60,"componentType":5126,"type":"VEC3","min":[-0.75,-0.0050000823102891445,-0.050000004470348358],"max":[0.74999988079071045,1.4950000047683716,0.050000008195638657]},{"bufferView":1,"byteOffset":0,"count":60,"componentType":5121,"type":"VEC4","normalized":true},{"bufferView":2,"byteOffset":0,"count":396,"componentType":5125,"type":"SCALAR"},{"bufferView":3,"byteOffset":0,"count":8,"componentType":5126,"type":"VEC3","min":[0,0.042998004704713821,0],"max":[0.039998002350330353,0.082998007535934448,0.039998002350330353]},{"bufferView":4,"byteOffset":0,"count":8,"componentType":5121,"type":"VEC4","normalized":true},{"bufferView":5,"byteOffset":0,"count":36,"componentType":5125,"type":"SCALAR"}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":720,"byteStride":12,"target":34962},{"buffer":0,"byteOffset":720,"byteLength":240,"byteStride":4,"target":34962},{"buffer":0,"byteOffset":960,"byteLength":1584,"target":34963},{"buffer":0,"byteOffset":2544,"byteLength":96,"byteStride":12,"target":34962},{"buffer":0,"byteOffset":2640,"byteLength":32,"byteStride":4,"target":34962},{"buffer":0,"byteOffset":2672,"byteLength":144,"target":34963}],"buffers":[{"byteLength":2816,"uri":"PlayZoneBoundary.bin"}]}

View File

@ -1,30 +0,0 @@
fileFormatVersion: 2
guid: 303177f7648454b4fb8179c1378dd1ec
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 715df9372183c47e389bb6e19fbc3b52, type: 3}
editorImportSettings:
generateSecondaryUVSet: 0
importSettings:
nodeNameMethod: 1
animationMethod: 2
generateMipMaps: 1
defaultMinFilterMode: 9729
defaultMagFilterMode: 9729
anisotropicFilterLevel: 1
instantiationSettings:
mask: -1
layer: 0
skinUpdateWhenOffscreen: 1
lightIntensityFactor: 1
sceneObjectCreation: 2
assetDependencies:
- type: 0
originalUri: Assets\Models\PlayZoneBoundary.bin
assetPath: Assets\Models\PlayZoneBoundary.bin
reportItems: []

View File

@ -29,7 +29,7 @@ Transform:
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 3, y: 3, z: 3}
m_LocalScale: {x: 5, y: 5, z: 5}
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 4274613733215928132}
@ -77,7 +77,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 42bb47879381c4f498a115b2b84b191a, type: 3}
m_Name:
m_EditorClassIdentifier:
ForcesManager: {fileID: 0}
RenderedZoneObject: {fileID: 3847966118592310179}
GravityEffect: {fileID: 2798249376021352391}
GravityColors:
@ -91,86 +90,122 @@ MonoBehaviour:
color: {r: 0.25471687, g: 0.77203095, b: 1, a: 0.3529412}
- gravity: 4
color: {r: 1, g: 0.4656382, b: 0.2471698, a: 0.3529412}
_gravity: 0
--- !u!1001 &4147390443820438502
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 5300185106086715317}
m_Modifications:
- target: {fileID: 930210402018179143, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_Name
value: Nimble Zone Sphere
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalScale.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalScale.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalScale.z
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalPosition.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
--- !u!4 &3847966118591952769 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 930210402018337895, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
m_PrefabInstance: {fileID: 4147390443820438502}
m_PrefabAsset: {fileID: 0}
--- !u!1 &3847966118592310179 stripped
_gravity: 4
--- !u!1 &3847966118592310177
GameObject:
m_CorrespondingSourceObject: {fileID: 930210402018179141, guid: 42641a1e05f4e084bae7d69b644dfd81, type: 3}
m_PrefabInstance: {fileID: 4147390443820438502}
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3847966118591952769}
m_Layer: 0
m_Name: Nimble Zone Sphere
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3847966118591952769
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3847966118592310177}
serializedVersion: 2
m_LocalRotation: {x: 0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -0, y: 0, z: 0}
m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 3847966118591952771}
m_Father: {fileID: 5300185106086715317}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &3847966118592310179
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3847966118591952771}
- component: {fileID: 3847966118591149987}
- component: {fileID: 3847966118590051683}
m_Layer: 0
m_Name: HighPolySphere
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3847966118591952771
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3847966118592310179}
serializedVersion: 2
m_LocalRotation: {x: 0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3847966118591952769}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3847966118591149987
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3847966118592310179}
m_Mesh: {fileID: 4300000, guid: fc5f274d483f9d24b95d2f4a7eb88be9, type: 3}
--- !u!23 &3847966118590051683
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3847966118592310179}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 5cddff495cc77524d991f9778fba844a, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1001 &7276724944824422886
PrefabInstance:
m_ObjectHideFlags: 0
@ -221,11 +256,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: ShapeModule.radius.value
value: 1.5
value: 3
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: ShapeModule.radiusThickness
value: 0.1
value: 0.2
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: VelocityModule.inWorldSpace
@ -239,17 +274,21 @@ PrefabInstance:
propertyPath: InitialModule.maxNumParticles
value: 80
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: InitialModule.startSize.scalar
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: VelocityModule.orbitalX.scalar
value: 0.1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: VelocityModule.orbitalY.scalar
value: 0.1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: VelocityModule.orbitalZ.scalar
value: 0.1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: InitialModule.startSpeed.scalar
@ -261,7 +300,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: InitialModule.startLifetime.scalar
value: 1
value: 1.5
objectReference: {fileID: 0}
- target: {fileID: 4767480441459301921, guid: 9615c7fd8e252c145b562238bcfc1b23, type: 3}
propertyPath: VelocityModule.speedModifier.scalar

View File

@ -92,12 +92,12 @@ MonoBehaviour:
zone: 0
rippleFrequency: 12
rippleDensity: 14
rippleAmplitude: 0.1
rippleAmplitude: 0.05
rippleRadius: 1.62
rippleDuration: 1.2
rippleDuration: 2
impactVelocityModifier: 1
minImpact: 0.5
maxVelocity: 70
minImpact: 0.4
maxVelocity: 100
--- !u!1001 &4415206198913254025
PrefabInstance:
m_ObjectHideFlags: 0
@ -165,7 +165,7 @@ PrefabInstance:
- target: {fileID: -7635826562936255635, guid: 24300c11f962a8e4f9f8125bd2843705, type: 3}
propertyPath: m_Materials.Array.data[0]
value:
objectReference: {fileID: 2100000, guid: 78cb0d90576fe15439f3fd294d5eaaba, type: 2}
objectReference: {fileID: 2100000, guid: 1338539d65504394f8f2dd0a628dc423, type: 2}
- target: {fileID: 919132149155446097, guid: 24300c11f962a8e4f9f8125bd2843705, type: 3}
propertyPath: m_Name
value: Hex Sphere

View File

@ -0,0 +1,130 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &5312737329671837370
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3436878586287575061}
m_Layer: 0
m_Name: Offscreen Indicator Arrow
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3436878586287575061
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5312737329671837370}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 2, y: 2, z: 3}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6331211089644692183}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &8144415942864253312
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6331211089644692183}
- component: {fileID: 4035525861259110635}
- component: {fileID: 7074929712647586998}
- component: {fileID: 8551325256346997925}
m_Layer: 0
m_Name: Indicator3D
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6331211089644692183
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8144415942864253312}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3436878586287575061}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &4035525861259110635
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8144415942864253312}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ed8517591bfdc6b4398d396bc386d5a2, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!33 &7074929712647586998
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8144415942864253312}
m_Mesh: {fileID: 3613567641014311022, guid: d912959aabd6a3e439552066ae82eb71, type: 3}
--- !u!23 &8551325256346997925
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8144415942864253312}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: ede4fd81521fbf14290f76017e016f6d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: fac9d84719a43574f9cfbc19b53aee98
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -6,7 +6,6 @@ using static GravityFunctionality.GravityHelpers;
namespace GravityFunctionality
{
[ExecuteInEditMode]
public class GravityChanger : MonoBehaviour
{
private static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

View File

@ -0,0 +1,25 @@
using System.Collections;
using System.Collections.Generic;
using PrimeTween;
using UnityEngine;
[ExecuteInEditMode]
public class Indicator3D : MonoBehaviour
{
void OnEnable()
{
WaitTillSpawnThenAnimate();
}
private async void WaitTillSpawnThenAnimate()
{
await Tween.Delay(0.1f);
Sequence.Create(cycles: -1, CycleMode.Rewind, Ease.Default)
.Group(Tween.LocalPosition(gameObject.transform,
gameObject.transform.localPosition - Vector3.forward * 0.001f, 4))
.Group(Tween.LocalRotation(gameObject.transform,
gameObject.transform.localRotation * Quaternion.AngleAxis(180, Vector3.forward), 4));
}
}

View File

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

View File

@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Managers;
using UnityEngine;
public class OffScreenIndicatorManager : MonoBehaviour
{
public GameObject[] Targets;
public GameObject IndicatorPrefab;
public Color DefaultColor = Color.yellow;
private MeshRenderer _meshRenderer;
private Camera _camera;
private Dictionary<GameObject, GameObject> _targetIndicators = new();
// Start is called before the first frame update
void Start()
{
_camera = Camera.main;
foreach (var target in Targets)
AddTarget(target);
}
// Update is called once per frame
void Update()
{
if (_camera == null)
{
if (Camera.main != null)
_camera = Camera.main;
return;
}
bool targetRemoved = false;
foreach (KeyValuePair<GameObject, GameObject> entry in _targetIndicators)
{
var target = entry.Key;
var indicator = entry.Value;
if (target != null)
{
UpdateTarget(target, indicator);
}
else
{
targetRemoved = true;
}
}
if (!targetRemoved)
return;
GameObject[] targets = _targetIndicators.Keys.ToArray();
for (int i = 0; i < targets.Count(); ++i)
{
if (targets[i] == null)
{
Destroy(_targetIndicators[targets[i]]);
_targetIndicators.Remove(targets[i]);
}
}
}
public void AddTarget(GameObject target)
{
AddTarget(target, DefaultColor);
}
public void AddTarget(GameObject target, Color color)
{
var indicator = Instantiate(IndicatorPrefab);
_meshRenderer = indicator.GetComponentInChildren<MeshRenderer>();
indicator.SetActive(false);
indicator.transform.SetParent(_camera.transform);
_targetIndicators.Add(target, indicator);
MaterialPropertyBlock materialPropertyBlock = new();
materialPropertyBlock.SetColor("_BaseColor", color);
_meshRenderer.SetPropertyBlock(materialPropertyBlock);
}
private void UpdateTarget(GameObject target, GameObject indicator)
{
if (MatchManager.G.matchState != MatchState.Match || target == null
|| !target.activeInHierarchy)
{
indicator.SetActive(false);
return;
}
var screenPos = _camera.WorldToViewportPoint(target.transform.position);
bool isOffScreen = screenPos.x <= 0 || screenPos.x >= 1 ||
screenPos.y <= 0 || screenPos.y >= 1;
if (!isOffScreen)
{
indicator.SetActive(false);
return;
}
indicator.SetActive(true);
float margin_x = 0.05f;
float margin_y = 0.05f;
screenPos.x = Mathf.Clamp(screenPos.x, margin_x, 1 - margin_x);
screenPos.y = Mathf.Clamp(screenPos.y, margin_y, 1 - margin_y);
screenPos.z = Mathf.Clamp(screenPos.z, 0, 1);
var worldPosition = _camera.ViewportToWorldPoint(screenPos);
var cameraDirection = _camera.transform.position - worldPosition;
indicator.transform.position = worldPosition;
var virtualIndicatorPosition = worldPosition + _camera.transform.localPosition.z * cameraDirection;
Vector3 direction = target.transform.position - virtualIndicatorPosition;
indicator.transform.rotation = Quaternion.FromToRotation(new Vector3(0, 0, 1), direction);
}
}

View File

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

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: cba0c70a2ad5c8e4c99a3097986dddd3
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: