Change directory to subfolder UnityProject
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8cbcc68bb8cc7e649b1f5bf601d24fec
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7404b992c6519d54c96c3489d921d0c1
|
||||
ScriptedImporter:
|
||||
fileIDToRecycleName:
|
||||
11400000: Assets/Brains/1_original_trained_brain.nn
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 11500000, guid: 83221ad3db87f4b3b91b041047cb2bc5, type: 3}
|
||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 95b359f17fe8fba4f8564c236b378d66
|
||||
ScriptedImporter:
|
||||
fileIDToRecycleName:
|
||||
11400000: Assets/Brains/2_modified_turnspeed_actionmask_brain.nn
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 11500000, guid: 83221ad3db87f4b3b91b041047cb2bc5, type: 3}
|
||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: af2054fbe8d1d9244a9dc1f5e1af9e47
|
||||
ScriptedImporter:
|
||||
fileIDToRecycleName:
|
||||
11400000: Assets/Brains/3_modified_actionmask_memory_3_brain.nn
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 11500000, guid: 83221ad3db87f4b3b91b041047cb2bc5, type: 3}
|
||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bedf7a4d1127eb74bbf17c848a8f5ad8
|
||||
ScriptedImporter:
|
||||
fileIDToRecycleName:
|
||||
11400000: Assets/Brains/4_modified_actionmask_memory_5_brain.nn
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 11500000, guid: 83221ad3db87f4b3b91b041047cb2bc5, type: 3}
|
||||
@@ -0,0 +1,27 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 8b23992c8eb17439887f5e944bf04a40, type: 3}
|
||||
m_Name: CozmoLearningBrain
|
||||
m_EditorClassIdentifier:
|
||||
brainParameters:
|
||||
vectorObservationSize: 0
|
||||
numStackedVectorObservations: 1
|
||||
vectorActionSize: 04000000
|
||||
cameraResolutions:
|
||||
- width: 80
|
||||
height: 30
|
||||
blackAndWhite: 1
|
||||
vectorActionDescriptions:
|
||||
-
|
||||
vectorActionSpaceType: 0
|
||||
model: {fileID: 11400000, guid: 7404b992c6519d54c96c3489d921d0c1, type: 3}
|
||||
inferenceDevice: 0
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0d9d5ce547064a648b466ad7f208cf3d
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c26458a5459583846bfc81de7487c5e8
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,77 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Cozmo_Red
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 0, b: 0, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 51801ddc2c2d0af4fa11eb95d070bf13
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,77 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Cozmo_White
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b37b4d2c262860f43ae4eb9316d7acdd
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,77 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: GroundMaterial
|
||||
m_Shader: {fileID: 10752, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: e2f202a27eca89449af658ee823922fb, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7f3a0759e06ddf74899cf4a62f849678
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d91737c7d8ed92a4a8afee7bd4826737
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,97 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eb30494ca4f519746880c4cf5e4020de
|
||||
ModelImporter:
|
||||
serializedVersion: 23
|
||||
fileIDToRecycleName:
|
||||
100000: //RootNode
|
||||
400000: //RootNode
|
||||
2100000: No Name
|
||||
2300000: //RootNode
|
||||
3300000: //RootNode
|
||||
4300000: Anki Cozmo
|
||||
externalObjects: {}
|
||||
materials:
|
||||
importMaterials: 1
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 1
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 0.001
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 0
|
||||
importLights: 0
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
optimizeMeshForGPU: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
preserveHierarchy: 0
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
previousCalculatedGlobalScale: 1
|
||||
hasPreviousCalculatedGlobalScale: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
importAnimation: 1
|
||||
copyAvatar: 0
|
||||
humanDescription:
|
||||
serializedVersion: 2
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
animationType: 0
|
||||
humanoidOversampling: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5cb8c424702101743a54c10d115c10c5
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 42bcf58d48729e442b51d02563fcf220
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,27 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09ab13753d5246142a30ab8c234cd071
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e0ec2722afe51ca46b1690230fb66cd5
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1582a0c292fc9a6488cbda67eec9647e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,377 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &891713638
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 891713639}
|
||||
- component: {fileID: 891713640}
|
||||
- component: {fileID: 891713641}
|
||||
m_Layer: 0
|
||||
m_Name: RenderTextureCamera
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &891713639
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 891713638}
|
||||
m_LocalRotation: {x: 0.30070576, y: 0, z: 0, w: 0.953717}
|
||||
m_LocalPosition: {x: 0, y: 0.037, z: 0.0319}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 7570006595835424293}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 35, y: 0, z: 0}
|
||||
--- !u!20 &891713640
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 891713638}
|
||||
m_Enabled: 0
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_GateFitMode: 2
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.01
|
||||
far clip plane: 2
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 8400000, guid: 196f45b12806aaa449adc2ee1ca3b091, type: 2}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 0
|
||||
m_AllowMSAA: 0
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!114 &891713641
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 891713638}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b940f59f459dc49479614595d02dcbbc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
renderTextureCropped: {fileID: 8400000, guid: 8bf12f4401860c043a77209428e97b29,
|
||||
type: 2}
|
||||
processedImageRenderer: {fileID: 0}
|
||||
processedImageRendererCropped: {fileID: 0}
|
||||
--- !u!1 &7536190859451953316
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 6557257430302465736}
|
||||
- component: {fileID: 6829507564963703646}
|
||||
m_Layer: 0
|
||||
m_Name: Camera
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &6557257430302465736
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7536190859451953316}
|
||||
m_LocalRotation: {x: 0.30070576, y: 0, z: 0, w: 0.953717}
|
||||
m_LocalPosition: {x: 0, y: 0.037, z: 0.0319}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 7570006595835424293}
|
||||
m_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 35, y: 0, z: 0}
|
||||
--- !u!20 &6829507564963703646
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7536190859451953316}
|
||||
m_Enabled: 0
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_GateFitMode: 2
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.01
|
||||
far clip plane: 2
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 0
|
||||
m_AllowMSAA: 0
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!1 &7570006595835424292
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 7570006595835424293}
|
||||
- component: {fileID: 7570006596986120127}
|
||||
- component: {fileID: 7570006596986120126}
|
||||
- component: {fileID: 7570006596986120125}
|
||||
- component: {fileID: 7570006596986120128}
|
||||
- component: {fileID: 7570006596986120129}
|
||||
- component: {fileID: 7570006596986120130}
|
||||
m_Layer: 0
|
||||
m_Name: Cozmo
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &7570006595835424293
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7570006595835424292}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0.5, y: 0.5, z: 0.5}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 1857425275648181110}
|
||||
- {fileID: 891713639}
|
||||
- {fileID: 6557257430302465736}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!54 &7570006596986120127
|
||||
Rigidbody:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7570006595835424292}
|
||||
serializedVersion: 2
|
||||
m_Mass: 1
|
||||
m_Drag: 0
|
||||
m_AngularDrag: 0.05
|
||||
m_UseGravity: 1
|
||||
m_IsKinematic: 0
|
||||
m_Interpolate: 0
|
||||
m_Constraints: 84
|
||||
m_CollisionDetection: 0
|
||||
--- !u!65 &7570006596986120126
|
||||
BoxCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7570006595835424292}
|
||||
m_Material: {fileID: 0}
|
||||
m_IsTrigger: 0
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_Size: {x: 0.05, y: 0.07, z: 0.08}
|
||||
m_Center: {x: 0, y: 0.035, z: 0}
|
||||
--- !u!114 &7570006596986120125
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7570006595835424292}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 234fd6e10ef55ad4b82b3153890ab5d9, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
brain: {fileID: 11400000, guid: 0d9d5ce547064a648b466ad7f208cf3d, type: 2}
|
||||
agentParameters:
|
||||
agentCameras: []
|
||||
agentRenderTextures:
|
||||
- {fileID: 8400000, guid: 8bf12f4401860c043a77209428e97b29, type: 2}
|
||||
maxStep: 5000
|
||||
resetOnDone: 1
|
||||
onDemandDecision: 1
|
||||
numberOfActionsBetweenDecisions: 1
|
||||
renderCamera: {fileID: 891713640}
|
||||
movementController: {fileID: 7570006596986120130}
|
||||
timeBetweenDecisionsAtInference: 0.15
|
||||
--- !u!114 &7570006596986120128
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7570006595835424292}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d2056048a78a0cc4c97e7899ba1c0e31, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Speed: 0.0535
|
||||
m_TurnSpeed: 55
|
||||
--- !u!114 &7570006596986120129
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7570006595835424292}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 4265d0764c65d26409f0f920e5293c82, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
testState: 1
|
||||
isTesting: 0
|
||||
--- !u!114 &7570006596986120130
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7570006595835424292}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d3ecda30187828846b48edbee97aebd7, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
currentMovementState: 0
|
||||
--- !u!1001 &1857425275647793654
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 7570006595835424293}
|
||||
m_Modifications:
|
||||
- target: {fileID: 100000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: Cozmo_7
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_RootOrder
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2300000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: 51801ddc2c2d0af4fa11eb95d070bf13, type: 2}
|
||||
m_RemovedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: eb30494ca4f519746880c4cf5e4020de, type: 3}
|
||||
--- !u!4 &1857425275648181110 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 400000, guid: eb30494ca4f519746880c4cf5e4020de,
|
||||
type: 3}
|
||||
m_PrefabInstance: {fileID: 1857425275647793654}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0f97dac5215d69a4795763340d82925d
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f7bfd8e7c28f2e04e9cc9cac02f96f8e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2b0b419445af9d44b84ac124a2015b65
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 893fca2eb8a186b4db23183ce0c43008
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dc9f178cf7c14df4ab61b1f7dcbc58d5
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,178 @@
|
||||
//using UnityEngine;
|
||||
//using OpenCvSharp;
|
||||
//using System.Threading.Tasks;
|
||||
|
||||
|
||||
//public class CannyTest : MonoBehaviour
|
||||
//{
|
||||
|
||||
// // Video parameters
|
||||
// public MeshRenderer CameraRenderer;
|
||||
// public MeshRenderer ProcessedImageRenderer;
|
||||
// public Camera textureCamera;
|
||||
|
||||
// // Video size
|
||||
// private const int imWidth = 1280; //TODO: Set width and height based on agent observation size
|
||||
// private const int imHeight = 720;
|
||||
// private int imFrameRate;
|
||||
|
||||
// // OpenCVSharp parameters
|
||||
// private Mat videoSourceImage;
|
||||
// private Mat cannyImage;
|
||||
// private Texture2D processedTexture;
|
||||
// private Vec3b[] videoSourceImageData;
|
||||
// private byte[] cannyImageData;
|
||||
|
||||
// // Frame rate parameter
|
||||
// private int updateFrameCount = 0;
|
||||
// private int textureCount = 0;
|
||||
// private int displayCount = 0;
|
||||
|
||||
// void Start()
|
||||
// {
|
||||
// // assign the camera texture to the meshrenderer
|
||||
// CameraRenderer.material.mainTexture = textureCamera.targetTexture;
|
||||
|
||||
// // initialize video / image with given size
|
||||
// videoSourceImage = new Mat(imHeight, imWidth, MatType.CV_8UC3);
|
||||
// videoSourceImageData = new Vec3b[imHeight * imWidth];
|
||||
// cannyImage = new Mat(imHeight, imWidth, MatType.CV_8UC1);
|
||||
// cannyImageData = new byte[imHeight * imWidth];
|
||||
|
||||
// // create processed video texture as Texture2D object
|
||||
// processedTexture = new Texture2D(imWidth, imHeight, TextureFormat.RGBA32, true, true);
|
||||
|
||||
// // assign the processedTexture to the meshrenderer for display
|
||||
// ProcessedImageRenderer.material.mainTexture = processedTexture;
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// void Update()
|
||||
// {
|
||||
|
||||
// updateFrameCount++;
|
||||
|
||||
|
||||
|
||||
// if (textureCamera.targetTexture.didUpdateThisFrame)
|
||||
// {
|
||||
|
||||
// textureCount++;
|
||||
|
||||
// // convert texture of original video to OpenCVSharp Mat object
|
||||
// TextureToMat();
|
||||
// // update the opencv window of source video
|
||||
// UpdateWindow(videoSourceImage);
|
||||
// // create the canny edge image out of source image
|
||||
// ProcessImage(videoSourceImage);
|
||||
// // convert the OpenCVSharp Mat of canny image to Texture2D
|
||||
// // the texture will be displayed automatically
|
||||
// MatToTexture();
|
||||
|
||||
// }
|
||||
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Debug.Log("Can't find camera!");
|
||||
// }
|
||||
|
||||
|
||||
// // output frame rate information
|
||||
// if (updateFrameCount % 30 == 0)
|
||||
// {
|
||||
// Debug.Log("Frame count: " + updateFrameCount + ", Texture count: " + textureCount + ", Display count: " + displayCount);
|
||||
// }
|
||||
|
||||
|
||||
// }
|
||||
|
||||
|
||||
// // Convert Unity Texture2D object to OpenCVSharp Mat object
|
||||
// void TextureToMat()
|
||||
//{
|
||||
// // Color32 array : r, g, b, a
|
||||
// Color32[] c = _webcamTexture.GetPixels32();
|
||||
|
||||
// // Parallel for loop
|
||||
// // convert Color32 object to Vec3b object
|
||||
// // Vec3b is the representation of pixel for Mat
|
||||
// Parallel.For(0, imHeight, i =>
|
||||
// {
|
||||
// for (var j = 0; j < imWidth; j++)
|
||||
// {
|
||||
// var col = c[j + i * imWidth];
|
||||
// var vec3 = new Vec3b
|
||||
// {
|
||||
// Item0 = col.b,
|
||||
// Item1 = col.g,
|
||||
// Item2 = col.r
|
||||
// };
|
||||
// // set pixel to an array
|
||||
// videoSourceImageData[j + i * imWidth] = vec3;
|
||||
// }
|
||||
// });
|
||||
// // assign the Vec3b array to Mat
|
||||
// videoSourceImage.SetArray(0, 0, videoSourceImageData);
|
||||
//}
|
||||
|
||||
|
||||
|
||||
//// Convert OpenCVSharp Mat object to Unity Texture2D object
|
||||
//void MatToTexture()
|
||||
//{
|
||||
// // cannyImageData is byte array, because canny image is grayscale
|
||||
// cannyImage.GetArray(0, 0, cannyImageData);
|
||||
// // create Color32 array that can be assigned to Texture2D directly
|
||||
// Color32[] c = new Color32[imHeight * imWidth];
|
||||
|
||||
// // parallel for loop
|
||||
// Parallel.For(0, imHeight, i =>
|
||||
// {
|
||||
// for (var j = 0; j < imWidth; j++)
|
||||
// {
|
||||
// byte vec = cannyImageData[j + i * imWidth];
|
||||
// var color32 = new Color32
|
||||
// {
|
||||
// r = vec,
|
||||
// g = vec,
|
||||
// b = vec,
|
||||
// a = 0
|
||||
// };
|
||||
// c[j + i * imWidth] = color32;
|
||||
// }
|
||||
// });
|
||||
|
||||
// processedTexture.SetPixels32(c);
|
||||
// // to update the texture, OpenGL manner
|
||||
// processedTexture.Apply();
|
||||
//}
|
||||
|
||||
|
||||
|
||||
//// Simple example of canny edge detect
|
||||
//void ProcessImage(Mat _image)
|
||||
//{
|
||||
// Cv2.Flip(_image, _image, FlipMode.X);
|
||||
// Cv2.Canny(_image, cannyImage, 100, 100);
|
||||
//}
|
||||
|
||||
|
||||
//// Display the original video in a opencv window
|
||||
//void UpdateWindow(Mat _image)
|
||||
//{
|
||||
// Cv2.Flip(_image, _image, FlipMode.X);
|
||||
// Cv2.ImShow("Copy video", _image);
|
||||
// displayCount++;
|
||||
//}
|
||||
|
||||
//// close the opencv window
|
||||
//public void OnDestroy()
|
||||
//{
|
||||
// Cv2.DestroyAllWindows();
|
||||
|
||||
//}
|
||||
|
||||
|
||||
//}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4d6afecccc2c5aa42a5c437ddf20a25c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,192 @@
|
||||
///-----------------------------------------------------------------
|
||||
/// Namespace: <Cozmo>
|
||||
/// Class: <ImageProcessor>
|
||||
/// Description: <Converts a rendertexture to a opencv mat in order to use the canny algorithm.
|
||||
/// After processing the mat will be converted to a render texture back again.>
|
||||
/// Author: <Tobias Hassel> Date: <29.07.2019>
|
||||
/// Notes: <>
|
||||
///-----------------------------------------------------------------
|
||||
///
|
||||
|
||||
using UnityEngine;
|
||||
using OpenCvSharp;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Cozmo
|
||||
{
|
||||
public class ImageProcessor : MonoBehaviour
|
||||
{
|
||||
[Header("RenderTexture")]
|
||||
[Tooltip("RenderTexture that will be passed to the LearningBrain.")]
|
||||
public RenderTexture renderTextureCropped;
|
||||
|
||||
[Header("Debug Helper")]
|
||||
[Tooltip("Reference to the MeshRenderer that will show the processed Image from Cozmo")]
|
||||
public MeshRenderer processedImageRenderer;
|
||||
[Tooltip("Reference to the MeshRenderer that will show the processed and cropped Image from Cozmo")]
|
||||
public MeshRenderer processedImageRendererCropped;
|
||||
|
||||
/// <summary>
|
||||
/// Center of Gravity in the cropped canny image
|
||||
/// </summary>
|
||||
public Point CenterOfGravity { get; private set; }
|
||||
|
||||
// OpenCVSharp parameters
|
||||
private Mat cozmoImageMat;
|
||||
private Mat cannyImage;
|
||||
private Texture2D finalProcessedCozmoTexture;
|
||||
private Vec3b[] cozmoImageData;
|
||||
private byte[] cannyImageData;
|
||||
|
||||
|
||||
private int imWidth = 320; // Width of the camera image from the virtual cozmo
|
||||
private int imHeight = 240; // Height of the camera image from the virtual cozmo
|
||||
private int croppedImHeight = 120; // Height of the cropped camera image from the virtual cozmo
|
||||
private Camera textureCamera; // Virtual Cozmo camera
|
||||
|
||||
private Texture2D originalCozmoTexture;
|
||||
|
||||
|
||||
private void Start()
|
||||
{
|
||||
// Get reference to the cozmo camera
|
||||
textureCamera = GetComponent<Camera>();
|
||||
|
||||
// Set image widths and heights based on the given RenderTextures
|
||||
imWidth = textureCamera.targetTexture.width;
|
||||
imHeight = textureCamera.targetTexture.height;
|
||||
|
||||
// assign the processed targetTexture to the renderer to display the image
|
||||
processedImageRenderer.material.mainTexture = textureCamera.targetTexture;
|
||||
processedImageRendererCropped.material.mainTexture = renderTextureCropped;
|
||||
|
||||
// initialize video / image with given size
|
||||
cozmoImageMat = new Mat(imHeight, imWidth, MatType.CV_8UC3);
|
||||
cozmoImageData = new Vec3b[imHeight * imWidth];
|
||||
cannyImage = new Mat(imHeight, imWidth, MatType.CV_8UC1);
|
||||
cannyImageData = new byte[croppedImHeight * imWidth];
|
||||
|
||||
originalCozmoTexture = new Texture2D(imWidth, imHeight, TextureFormat.RGBA32, true, true);
|
||||
finalProcessedCozmoTexture = new Texture2D(imWidth, croppedImHeight, TextureFormat.RGBA32, true, true);
|
||||
}
|
||||
|
||||
///// <summary>
|
||||
///// Gets called when a new image arrives from the camera this script lies on
|
||||
///// </summary>
|
||||
///// <param name="source"></param>
|
||||
///// <param name="destination"></param>
|
||||
public void OnRenderImage(RenderTexture source, RenderTexture destination)
|
||||
{
|
||||
RenderTextureToTexture2D(source);
|
||||
TextureToMat(originalCozmoTexture);
|
||||
ProcessImage(cozmoImageMat);
|
||||
cannyImage = CropImage(cannyImage);
|
||||
FindCenterOfGravity(cannyImage);
|
||||
MatToTexture(cannyImage);
|
||||
|
||||
Graphics.Blit(finalProcessedCozmoTexture, destination);
|
||||
Graphics.Blit(finalProcessedCozmoTexture, renderTextureCropped);
|
||||
}
|
||||
|
||||
// Crop image to just see the middle of the original image
|
||||
private Mat CropImage(Mat image)
|
||||
{
|
||||
//cut a fourth out of the top and bottom of the image
|
||||
OpenCvSharp.Rect rectCroped = new OpenCvSharp.Rect(0, image.Height / 4, image.Width, image.Height / 2);
|
||||
Mat croppedImage = new Mat(image, rectCroped);
|
||||
return croppedImage;
|
||||
}
|
||||
|
||||
// Convert the rendertexture to a texture2d
|
||||
private void RenderTextureToTexture2D(RenderTexture rTex)
|
||||
{
|
||||
RenderTexture.active = rTex;
|
||||
originalCozmoTexture.ReadPixels(new UnityEngine.Rect(0, 0, rTex.width, rTex.height), 0, 0);
|
||||
originalCozmoTexture.Apply();
|
||||
}
|
||||
|
||||
// Convert Unity Texture2D object to OpenCVSharp Mat object
|
||||
private void TextureToMat(Texture2D source)
|
||||
{
|
||||
// Color32 array : r, g, b, a
|
||||
Color32[] c = source.GetPixels32();
|
||||
|
||||
// Parallel for loop
|
||||
// convert Color32 object to Vec3b object
|
||||
// Vec3b is the representation of pixel for Mat
|
||||
Parallel.For(0, imHeight, i =>
|
||||
{
|
||||
for (var j = 0; j < imWidth; j++)
|
||||
{
|
||||
var col = c[j + i * imWidth];
|
||||
var vec3 = new Vec3b
|
||||
{
|
||||
Item0 = col.b,
|
||||
Item1 = col.g,
|
||||
Item2 = col.r
|
||||
};
|
||||
// set pixel to an array
|
||||
cozmoImageData[j + i * imWidth] = vec3;
|
||||
}
|
||||
});
|
||||
|
||||
// assign the Vec3b array to Mat
|
||||
cozmoImageMat.SetArray(0, 0, cozmoImageData);
|
||||
}
|
||||
|
||||
|
||||
// Simple example of canny edge detect
|
||||
private void ProcessImage(Mat _image)
|
||||
{
|
||||
Cv2.Canny(_image, cannyImage, 100, 100);
|
||||
}
|
||||
|
||||
|
||||
// Convert OpenCVSharp Mat object to Unity Texture2D object
|
||||
private void MatToTexture(Mat mat)
|
||||
{
|
||||
// cannyImageData is byte array, because canny image is binary
|
||||
mat.GetArray(0, 0, cannyImageData);
|
||||
// create Color32 array that can be assigned to Texture2D directly
|
||||
Color32[] c = new Color32[croppedImHeight * imWidth];
|
||||
|
||||
// parallel for loop
|
||||
Parallel.For(0, croppedImHeight, i =>
|
||||
{
|
||||
for (var j = 0; j < imWidth; j++)
|
||||
{
|
||||
byte vec = cannyImageData[j + i * imWidth];
|
||||
var color32 = new Color32
|
||||
{
|
||||
r = vec,
|
||||
g = vec,
|
||||
b = vec,
|
||||
a = 0
|
||||
};
|
||||
c[j + i * imWidth] = color32;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
finalProcessedCozmoTexture.SetPixels32(c);
|
||||
// update texture
|
||||
finalProcessedCozmoTexture.Apply();
|
||||
}
|
||||
|
||||
// Find the Center of Gravity in the image
|
||||
private void FindCenterOfGravity(Mat processedImage)
|
||||
{
|
||||
// find moments of the image
|
||||
Moments m = new Moments(processedImage, true);
|
||||
CenterOfGravity = new Point(m.M10 / m.M00, m.M01 / m.M00);
|
||||
|
||||
#if UNITY_EDITOR
|
||||
// show the image with a point mark at the centroid
|
||||
Cv2.Circle(processedImage, CenterOfGravity, 5, new Scalar(128, 0, 0), -1);
|
||||
Cv2.Flip(processedImage, processedImage, FlipMode.X);
|
||||
Cv2.ImShow("Image with center", processedImage);
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b940f59f459dc49479614595d02dcbbc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,121 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class EnvironmentGenerator : MonoBehaviour
|
||||
{
|
||||
[Tooltip("Width of the whole ground plane")]
|
||||
public float width = 1;
|
||||
[Tooltip("Height of the whole ground plane")]
|
||||
public float height = 1;
|
||||
|
||||
[Tooltip("Amount of planes drawn horizontally in the whole plane area.")]
|
||||
[Range(1, 20)]
|
||||
public uint amountOfHorizontalElements = 5;
|
||||
[Tooltip("Amount of planes drawn vertically in the whole plane area.")]
|
||||
[Range(1, 20)]
|
||||
public uint amountOfVerticalElements = 5;
|
||||
[Tooltip("The material the ground uses")]
|
||||
public Material groundMaterial;
|
||||
[Tooltip("Only for testing.")]
|
||||
public bool testDestroy = false;
|
||||
|
||||
public GameObject[,] CurrentEnvironment { get; private set; }
|
||||
|
||||
private void Start()
|
||||
{
|
||||
CreateNewEnvironment();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
TestEnvironmentCreation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Only for testing, can be deleted if not needed anymore
|
||||
/// </summary>
|
||||
private void TestEnvironmentCreation()
|
||||
{
|
||||
if (testDestroy)
|
||||
{
|
||||
UpdateEnvironment();
|
||||
testDestroy = !testDestroy;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a grid of planes
|
||||
/// </summary>
|
||||
public void CreateNewEnvironment()
|
||||
{
|
||||
CurrentEnvironment = new GameObject[amountOfHorizontalElements, amountOfVerticalElements];
|
||||
|
||||
float widthSingleEleme = width / amountOfHorizontalElements; //width of a single quad
|
||||
float heightSingleElem = height / amountOfVerticalElements; //height of a single quad
|
||||
|
||||
// calculate the left-upper-point of the whole environment plane to use it as a startpoint for creating the grid
|
||||
Vector3 leftUpperPoint = transform.position + (Vector3.left * (width / 2) + (Vector3.forward * (height / 2)));
|
||||
|
||||
Vector3 currentStartPoint = leftUpperPoint + new Vector3(widthSingleEleme / 2, 0, -heightSingleElem / 2);
|
||||
|
||||
//First draw all horizontal planes than do the next line in the grid
|
||||
for (int idxX = 0; idxX < amountOfVerticalElements; idxX++)
|
||||
{
|
||||
CreateHorizontalPlaneLine(currentStartPoint, widthSingleEleme, heightSingleElem, idxX);
|
||||
currentStartPoint += Vector3.back * heightSingleElem;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Create a horizontal line of Planes
|
||||
private void CreateHorizontalPlaneLine(Vector3 startPoint, float widthPlane = 1, float heightPlane = 1, int idxX = 1)
|
||||
{
|
||||
Vector3 currentStartPoint = startPoint;
|
||||
|
||||
for (int idxY = 0; idxY < amountOfHorizontalElements; idxY++)
|
||||
{
|
||||
CreatePlane(widthPlane, heightPlane, idxX, currentStartPoint, idxY);
|
||||
currentStartPoint += Vector3.right * widthPlane;
|
||||
}
|
||||
}
|
||||
|
||||
// Create a single Plane
|
||||
private void CreatePlane(float widthPlane, float heightPlane, int idxX, Vector3 currentStartPoint, int idxY)
|
||||
{
|
||||
GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Quad);
|
||||
plane.transform.localEulerAngles = new Vector3(90, 0, 0);
|
||||
plane.transform.position = currentStartPoint;
|
||||
plane.transform.localScale = new Vector3(widthPlane, heightPlane, 1);
|
||||
plane.transform.SetParent(this.transform);
|
||||
plane.GetComponent<Renderer>().material = groundMaterial;
|
||||
|
||||
CurrentEnvironment[idxX, idxY] = plane;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Destroy all Planes and set the environment array back to null
|
||||
/// </summary>
|
||||
public void DeleteCurrentEnvironment()
|
||||
{
|
||||
foreach (Transform child in transform)
|
||||
{
|
||||
if (child != this)
|
||||
{
|
||||
Destroy(child.gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
CurrentEnvironment = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the current environment if there is any and creates a new one
|
||||
/// </summary>
|
||||
public void UpdateEnvironment()
|
||||
{
|
||||
DeleteCurrentEnvironment();
|
||||
CreateNewEnvironment();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6279e2499d1811045a857f890736f7ba
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class LineGenerator : MonoBehaviour
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d204f699bf0f397419a5f40c948ff063
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9c7eb7dc728d65c49b1b20f4c37fb8c7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,36 @@
|
||||
///-----------------------------------------------------------------
|
||||
/// Namespace: <Cozmo>
|
||||
/// Class: <CozmoAcademy>
|
||||
/// Description: <The academy used for cozmo. Sets cozmo back to its starting position if the academy gets reset.>
|
||||
/// Author: <Tobias Hassel> Date: <29.07.2019>
|
||||
/// Notes: <>
|
||||
///-----------------------------------------------------------------
|
||||
///
|
||||
|
||||
using MLAgents;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Cozmo
|
||||
{
|
||||
public class CozmoAcademy : Academy
|
||||
{
|
||||
[Tooltip("Reference to the cozmo gameobject in the scene.")]
|
||||
public GameObject cozmo;
|
||||
[Tooltip("Reference to the transform which represents the starting position for cozmo.")]
|
||||
public Transform startPoint;
|
||||
|
||||
|
||||
public override void AcademyReset()
|
||||
{
|
||||
SetCozmoBackToStartingPosition();
|
||||
}
|
||||
|
||||
// Resets Cozmos position and rotation to match its starting position
|
||||
private void SetCozmoBackToStartingPosition()
|
||||
{
|
||||
cozmo.transform.position = startPoint.position;
|
||||
cozmo.transform.rotation = startPoint.rotation;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23300f50ba861924c93dc5008ffb90d7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,284 @@
|
||||
///-----------------------------------------------------------------
|
||||
/// Namespace: <Cozmo>
|
||||
/// Class: <CozmoAgent>
|
||||
/// Description: <The actual agent in the scene. Collects observations and executes the actions.
|
||||
/// Also rewards the agent and sets an actionmask.>
|
||||
/// Author: <Tobias Hassel> Date: <29.07.2019>
|
||||
/// Notes: <>
|
||||
///-----------------------------------------------------------------
|
||||
///
|
||||
|
||||
using MLAgents;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Cozmo
|
||||
{
|
||||
public class CozmoAgent : Agent
|
||||
{
|
||||
// Possible Actions
|
||||
private const int STOP = 0;
|
||||
private const int FORWARD = 1;
|
||||
private const int RIGHT = 2;
|
||||
private const int LEFT = 3;
|
||||
|
||||
// Used to determine different areas in the image (near to the center, far away)
|
||||
private const float NEAR_AREA_PERCENTAGE_OFFSET = 0.3f;
|
||||
|
||||
[Tooltip("The virtual Cozmo camera")]
|
||||
public Camera renderCamera;
|
||||
[Tooltip("Reference to the CozmoMovement script")]
|
||||
public CozmoMovementController movementController;
|
||||
[Tooltip("The time between decisions at inference")]
|
||||
public float timeBetweenDecisionsAtInference;
|
||||
[Tooltip("The amout of actions that should be remembered by the agent.")]
|
||||
public int maxStoredMovementStates = 1;
|
||||
[Tooltip("If activated the maxStoredMovementStates has no impact on the training.")]
|
||||
public bool useOriginalActionMasking = true;
|
||||
|
||||
private Academy academy; // CozmoAcademy
|
||||
private float timeSinceDecision; // time since last decision
|
||||
private ImageProcessor imageProcessor; // reference to the ImageProcessor
|
||||
private int nearAreaLimit = 0; // X coordinate limit for the near to the imagecenter area
|
||||
private int centerOfImageX = 0; // Middle of the image in x direction
|
||||
private MovementState lastChosenMovement = MovementState.Stop; // The last action/movement that was executed
|
||||
private Queue<MovementState> lastActions = new Queue<MovementState>(); // Queue to store the last chosen Actions
|
||||
|
||||
private double startTime = 0;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
startTime = Time.time;
|
||||
academy = FindObjectOfType(typeof(CozmoAcademy)) as CozmoAcademy;
|
||||
imageProcessor = renderCamera.GetComponent<ImageProcessor>();
|
||||
nearAreaLimit = (int)(renderCamera.targetTexture.width / 2 * NEAR_AREA_PERCENTAGE_OFFSET);
|
||||
centerOfImageX = renderCamera.targetTexture.width / 2;
|
||||
}
|
||||
|
||||
|
||||
public void FixedUpdate()
|
||||
{
|
||||
WaitTimeInference();
|
||||
}
|
||||
|
||||
|
||||
public override void CollectObservations()
|
||||
{
|
||||
SetMask();
|
||||
}
|
||||
|
||||
// Set ActionMask for training
|
||||
// Needs to be called from CollectObservations()
|
||||
private void SetMask()
|
||||
{
|
||||
if (useOriginalActionMasking)
|
||||
{
|
||||
// Stop is never allowed
|
||||
switch (lastChosenMovement)
|
||||
{
|
||||
// Do not allow stop decision after a stop
|
||||
case (MovementState.Stop):
|
||||
SetActionMask(STOP);
|
||||
break;
|
||||
// Do not allow stop after forward
|
||||
case (MovementState.Forward):
|
||||
SetActionMask(STOP);
|
||||
break;
|
||||
// Do not allow stop & left after right
|
||||
case (MovementState.Right):
|
||||
SetActionMask(STOP);
|
||||
SetActionMask(LEFT);
|
||||
break;
|
||||
// Do not allow stop & right after left
|
||||
case (MovementState.Left):
|
||||
SetActionMask(STOP);
|
||||
SetActionMask(RIGHT);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentException("Invalid MovementState.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Do not allow stop decision after a stop
|
||||
if (lastChosenMovement == MovementState.Stop)
|
||||
{
|
||||
SetActionMask(STOP);
|
||||
}
|
||||
|
||||
// Do not allow left decision if right was in the last actions
|
||||
if (lastActions.Contains(MovementState.Right))
|
||||
{
|
||||
SetActionMask(LEFT);
|
||||
}
|
||||
|
||||
// Do not allow right decision if left was in the last actions
|
||||
if (lastActions.Contains(MovementState.Left))
|
||||
{
|
||||
SetActionMask(RIGHT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// to be implemented by the developer
|
||||
public override void AgentAction(float[] vectorAction, string textAction)
|
||||
{
|
||||
double elapsedTime = Time.time - startTime;
|
||||
//Debug.Log("Elapsed time: " + elapsedTime);
|
||||
startTime = Time.time;
|
||||
|
||||
int action = Mathf.FloorToInt(vectorAction[0]);
|
||||
Point centerOfGravity = imageProcessor.CenterOfGravity;
|
||||
|
||||
AddReward(-0.01f);
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case STOP:
|
||||
movementController.currentMovementState = MovementState.Stop;
|
||||
lastChosenMovement = MovementState.Stop;
|
||||
SetReward(-0.02f);
|
||||
break;
|
||||
case FORWARD:
|
||||
movementController.currentMovementState = MovementState.Forward;
|
||||
lastChosenMovement = MovementState.Forward;
|
||||
SetReward(0.02f);
|
||||
break;
|
||||
case RIGHT:
|
||||
movementController.currentMovementState = MovementState.Right;
|
||||
lastChosenMovement = MovementState.Right;
|
||||
SetReward(0.01f);
|
||||
break;
|
||||
case LEFT:
|
||||
movementController.currentMovementState = MovementState.Left;
|
||||
lastChosenMovement = MovementState.Left;
|
||||
SetReward(0.01f);
|
||||
break;
|
||||
default:
|
||||
//movement.Move(0);
|
||||
throw new ArgumentException("Invalid action value. Stop movement.");
|
||||
}
|
||||
|
||||
if (!useOriginalActionMasking)
|
||||
CollectLastMovementStates(lastChosenMovement);
|
||||
|
||||
// Render new image after movement in order to update the centerOfGravity
|
||||
if (renderCamera != null)
|
||||
{
|
||||
renderCamera.Render();
|
||||
}
|
||||
|
||||
RewardAgent();
|
||||
}
|
||||
|
||||
// Set the reward for the agent based on how far away the center of gravity is from the center of the image
|
||||
private void RewardAgent()
|
||||
{
|
||||
float centerOfGravityX = imageProcessor.CenterOfGravity.X;
|
||||
float reward = 0;
|
||||
|
||||
// Center of gravity is far away from the center (left)
|
||||
if (centerOfGravityX <= centerOfImageX - nearAreaLimit && centerOfGravityX >= 0)
|
||||
{
|
||||
float range = centerOfImageX - nearAreaLimit;
|
||||
reward = -(1 - (centerOfGravityX / range));
|
||||
// Clamp the reward to max -1 and divide it by 2
|
||||
reward = Mathf.Clamp(reward, -1, 0) / 2;
|
||||
}
|
||||
// Center of gravity is near left of the center
|
||||
else if ((centerOfGravityX <= centerOfImageX) && (centerOfGravityX >= (centerOfImageX - nearAreaLimit)))
|
||||
{
|
||||
float range = centerOfImageX - (centerOfImageX - nearAreaLimit);
|
||||
float distanceToLeftFarBorder = centerOfGravityX - (centerOfImageX - nearAreaLimit);
|
||||
reward = (distanceToLeftFarBorder / range);
|
||||
}
|
||||
// Center of gravity is far away from the center (right)
|
||||
else if ((centerOfGravityX >= (centerOfImageX + nearAreaLimit)) && (centerOfGravityX <= renderCamera.targetTexture.width))
|
||||
{
|
||||
float range = renderCamera.targetTexture.width - (centerOfImageX + nearAreaLimit);
|
||||
reward = -(((centerOfGravityX - (centerOfImageX + nearAreaLimit)) / range));
|
||||
// Clamp the reward to max -1 in order to handle rewards if the center of gravity is outside of the image
|
||||
reward = Mathf.Clamp(reward, -1, 0) / 2;
|
||||
}
|
||||
// Center of gravity is near right of the center
|
||||
else if ((centerOfGravityX >= centerOfImageX) && (centerOfGravityX <= (centerOfImageX + nearAreaLimit)))
|
||||
{
|
||||
float range = (centerOfImageX + nearAreaLimit) - centerOfImageX;
|
||||
float distanceToCenterOfImage = centerOfGravityX - centerOfImageX;
|
||||
reward = (1 - distanceToCenterOfImage / range);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetReward(-1);
|
||||
AgentReset();
|
||||
Debug.Log("Out of image range");
|
||||
}
|
||||
|
||||
Debug.Log("Reward: " + reward);
|
||||
SetReward(reward);
|
||||
}
|
||||
|
||||
// Store the last movementStates in a Queue
|
||||
private void CollectLastMovementStates(MovementState movementState)
|
||||
{
|
||||
// Check if Queue exists and values should be stored
|
||||
if ((lastActions != null) && (maxStoredMovementStates > 0))
|
||||
{
|
||||
// maxStoredMovementStates is reached
|
||||
if (lastActions.Count >= maxStoredMovementStates)
|
||||
{
|
||||
// deque first value(s) when maxStoredMovementStates is reached
|
||||
for (int i = 0; i <= (lastActions.Count - maxStoredMovementStates); i++)
|
||||
{
|
||||
lastActions.Dequeue();
|
||||
}
|
||||
}
|
||||
// add last action to queue
|
||||
lastActions.Enqueue(movementState);
|
||||
}
|
||||
}
|
||||
|
||||
// to be implemented by the developer
|
||||
public override void AgentReset()
|
||||
{
|
||||
academy.AcademyReset();
|
||||
}
|
||||
|
||||
|
||||
private void OnTriggerEnter(Collider other)
|
||||
{
|
||||
if (other.transform.CompareTag("Goal"))
|
||||
{
|
||||
Done();
|
||||
}
|
||||
}
|
||||
|
||||
private void WaitTimeInference()
|
||||
{
|
||||
if (renderCamera != null)
|
||||
{
|
||||
renderCamera.Render();
|
||||
}
|
||||
|
||||
if (!academy.GetIsInference())
|
||||
{
|
||||
RequestDecision();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (timeSinceDecision >= timeBetweenDecisionsAtInference)
|
||||
{
|
||||
timeSinceDecision = 0f;
|
||||
RequestDecision();
|
||||
}
|
||||
else
|
||||
{
|
||||
timeSinceDecision += Time.fixedDeltaTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 234fd6e10ef55ad4b82b3153890ab5d9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8400d2753da4d924bbdb3537db7363ac
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,120 @@
|
||||
///-----------------------------------------------------------------
|
||||
/// Namespace: <Cozmo>
|
||||
/// Class: <CozmoMovement>
|
||||
/// Description: <Defines the possible movement of the virtual cozmo.>
|
||||
/// Author: <Tobias Hassel> Date: <29.07.2019>
|
||||
/// Notes: <>
|
||||
///-----------------------------------------------------------------
|
||||
///
|
||||
|
||||
|
||||
using UnityEngine;
|
||||
|
||||
namespace Cozmo
|
||||
{
|
||||
public class CozmoMovement : MonoBehaviour
|
||||
{
|
||||
private const string MOVEMENT_AXIS_NAME = "Vertical"; // name of the movement input axis
|
||||
private const string TURN_AXIS_NAME = "Horizontal"; // name of the rotation input axis
|
||||
|
||||
[Tooltip("Determines how fast the robot is moving forward and backwards.")]
|
||||
public float m_Speed = 12f;
|
||||
[Tooltip("Determines how fast the robot is turning in degrees per second.")]
|
||||
public float m_TurnSpeed = 180f;
|
||||
|
||||
private Rigidbody cozmoRigidbody; // Reference to cozmos rigidbody
|
||||
private float m_MovementInputValue; // current input value for movement
|
||||
private float m_TurnInputValue; // current input value for rotation
|
||||
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
cozmoRigidbody = GetComponent<Rigidbody>();
|
||||
}
|
||||
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
// When the cozmo is turned on, make sure it's not kinematic.
|
||||
cozmoRigidbody.isKinematic = false;
|
||||
|
||||
// reset movement and rotation values
|
||||
m_MovementInputValue = 0f;
|
||||
m_TurnInputValue = 0f;
|
||||
}
|
||||
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
// When the cozmo is turned off, set it to kinematic so it stops moving.
|
||||
cozmoRigidbody.isKinematic = true;
|
||||
}
|
||||
|
||||
|
||||
private void Update()
|
||||
{
|
||||
// Store the value of both input axes.
|
||||
m_MovementInputValue = Input.GetAxis(MOVEMENT_AXIS_NAME);
|
||||
m_TurnInputValue = Input.GetAxis(TURN_AXIS_NAME);
|
||||
}
|
||||
|
||||
|
||||
private void FixedUpdate()
|
||||
{
|
||||
// Adjust position and rotation
|
||||
Move();
|
||||
Turn();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Move the cozmo forward (0 < directionValue <= 1) or backwards (0 > directionvalue >= -1)
|
||||
/// </summary>
|
||||
/// <param name="directionValue"></param>
|
||||
public void Move(float directionValue)
|
||||
{
|
||||
// clamp directionValue to make sure its between -1 and 1
|
||||
Mathf.Clamp(directionValue, -1, 1);
|
||||
|
||||
Vector3 movement = directionValue * transform.forward * m_Speed * Time.deltaTime;
|
||||
|
||||
// Apply this movement to the rigidbody's position.
|
||||
cozmoRigidbody.MovePosition(cozmoRigidbody.position + movement);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Move cozmo based on the input value
|
||||
/// </summary>
|
||||
public void Move()
|
||||
{
|
||||
Move(m_MovementInputValue);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Rotate cozmo based on the input value
|
||||
/// </summary>
|
||||
public void Turn()
|
||||
{
|
||||
Turn(m_TurnInputValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rotate cozmo
|
||||
/// </summary>
|
||||
/// <param name="turnValue"></param>
|
||||
public void Turn(float turnValue)
|
||||
{
|
||||
// clamp turnValue to make sure its between -1 and 1
|
||||
Mathf.Clamp(turnValue, -1, 1);
|
||||
|
||||
float turn = turnValue * m_TurnSpeed * Time.deltaTime;
|
||||
|
||||
// Make this into a rotation in the y axis.
|
||||
Quaternion turnRotation = Quaternion.Euler(0f, turn, 0f);
|
||||
|
||||
// Apply this rotation to the rigidbody's rotation.
|
||||
cozmoRigidbody.MoveRotation(cozmoRigidbody.rotation * turnRotation);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d2056048a78a0cc4c97e7899ba1c0e31
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,55 @@
|
||||
///-----------------------------------------------------------------
|
||||
/// Namespace: <Cozmo>
|
||||
/// Class: <CozmoMovementController>
|
||||
/// Description: <Statemachine to control the movement of the virtual cozmo.>
|
||||
/// Author: <Tobias Hassel> Date: <29.07.2019>
|
||||
/// Notes: <>
|
||||
///-----------------------------------------------------------------
|
||||
///
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Cozmo
|
||||
{
|
||||
// Different movementstates cozmo can use
|
||||
public enum MovementState { Stop, Forward, Right, Left }
|
||||
|
||||
[RequireComponent(typeof(CozmoMovement))]
|
||||
public class CozmoMovementController : MonoBehaviour
|
||||
{
|
||||
[Tooltip("Current MovementState of the Robot. Change this to make the robot move.")]
|
||||
public MovementState currentMovementState = MovementState.Stop;
|
||||
|
||||
private CozmoMovement movement; // Movement script of the robot
|
||||
|
||||
|
||||
void Start()
|
||||
{
|
||||
movement = GetComponent<CozmoMovement>();
|
||||
}
|
||||
|
||||
private void FixedUpdate()
|
||||
{
|
||||
switch (currentMovementState)
|
||||
{
|
||||
case MovementState.Stop:
|
||||
movement.Move(0);
|
||||
break;
|
||||
case MovementState.Forward:
|
||||
movement.Move(1);
|
||||
break;
|
||||
case MovementState.Right:
|
||||
movement.Turn(1);
|
||||
break;
|
||||
case MovementState.Left:
|
||||
movement.Turn(-1);
|
||||
break;
|
||||
default:
|
||||
movement.Move(0);
|
||||
throw new ArgumentException("No real Movementstate was given. Default 'Stop' was chosen.");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d3ecda30187828846b48edbee97aebd7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,126 @@
|
||||
///-----------------------------------------------------------------
|
||||
/// Namespace: <CozmoHelpers>
|
||||
/// Class: <CozmoMovementTester>
|
||||
/// Description: <Used to measure the time for rotating and moving the virtual cozmo to copy the
|
||||
/// real cozmos movement behaviour.>
|
||||
/// Author: <Tobias Hassel> Date: <29.07.2019>
|
||||
/// Notes: <>
|
||||
///-----------------------------------------------------------------
|
||||
///
|
||||
|
||||
using Cozmo;
|
||||
using System.Diagnostics;
|
||||
using UnityEngine;
|
||||
|
||||
namespace CozmoHelpers
|
||||
{
|
||||
public enum TestStates { MovementSpeed, RotationSpeed } // enum to determine test scenarios
|
||||
|
||||
[RequireComponent(typeof(CozmoMovement))]
|
||||
public class CozmoMovementTester : MonoBehaviour
|
||||
{
|
||||
|
||||
private const float DISTANCE_TO_MEASURE_SPEED = 1f; // Distance that is used to calculate cozmos movementspeed (in m)
|
||||
private const float ROTATION_ANGLE = 90f; // Angle that is used to calculate cozmos rotationspeed
|
||||
|
||||
private CozmoMovement movement; // Reference to the movement script of cozmo
|
||||
private Vector3 startPositionCozmo; // Original position of cozmo
|
||||
private float lastY; // Last Y of cozmo
|
||||
private Stopwatch movementWatch; // Stopwatch to measure the time for the movement usecase
|
||||
private Stopwatch rotationWatch; // Stopwatch to measure the time for the rotation usecase
|
||||
|
||||
[Tooltip("Choose which speed of the virtual cozmo should be tested.")]
|
||||
public TestStates testState = TestStates.MovementSpeed;
|
||||
|
||||
[Tooltip("Start and stop testing from the inspector.")]
|
||||
public bool isTesting = false;
|
||||
|
||||
|
||||
void Start()
|
||||
{
|
||||
movement = GetComponent<CozmoMovement>();
|
||||
movementWatch = new Stopwatch();
|
||||
rotationWatch = new Stopwatch();
|
||||
|
||||
|
||||
startPositionCozmo = movement.transform.position; // Cache the starting position of Cozmo
|
||||
lastY = movement.transform.rotation.y; // Cache the rotation Vector of Cozmo
|
||||
}
|
||||
|
||||
private void FixedUpdate()
|
||||
{
|
||||
if (isTesting)
|
||||
{
|
||||
if (testState == TestStates.MovementSpeed)
|
||||
{
|
||||
TestMovementSpeed();
|
||||
}
|
||||
else if (testState == TestStates.RotationSpeed)
|
||||
{
|
||||
TestRotationSpeed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Measure time for rotation
|
||||
private void TestRotationSpeed()
|
||||
{
|
||||
|
||||
float currentY = movement.transform.rotation.eulerAngles.y;
|
||||
|
||||
// If distance between start and current position of cozmo reached the DISTANCE_TO_MEASURE_SPEED stop the stopwatch
|
||||
if (currentY >= lastY + ROTATION_ANGLE || currentY <= lastY - ROTATION_ANGLE)
|
||||
{
|
||||
if (rotationWatch.IsRunning)
|
||||
{
|
||||
rotationWatch.Stop();
|
||||
UnityEngine.Debug.Log("Cozmo: " + gameObject.name +
|
||||
"\nElapsed time in milliseconds (Rotation): " + rotationWatch.ElapsedMilliseconds);
|
||||
}
|
||||
|
||||
isTesting = false;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Start stopwatch to measure the time cozmo needs for a specific rotation
|
||||
if (!rotationWatch.IsRunning)
|
||||
{
|
||||
rotationWatch = Stopwatch.StartNew();
|
||||
}
|
||||
|
||||
// Turn right
|
||||
movement.Turn(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Measure time for movement
|
||||
private void TestMovementSpeed()
|
||||
{
|
||||
// If distance between start and current position of cozmo reached the DISTANCE_TO_MEASURE_SPEED stop the stopwatch
|
||||
if (Vector3.Distance(startPositionCozmo, movement.transform.position) >= DISTANCE_TO_MEASURE_SPEED)
|
||||
{
|
||||
if (movementWatch.IsRunning)
|
||||
{
|
||||
movementWatch.Stop();
|
||||
UnityEngine.Debug.Log("Cozmo: " + gameObject.name +
|
||||
"/nElapsed time in milliseconds (Movement): " + movementWatch.ElapsedMilliseconds);
|
||||
}
|
||||
|
||||
isTesting = false;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Start stopwatch to measure the time cozmo needs for a specific distance
|
||||
if (!movementWatch.IsRunning)
|
||||
{
|
||||
movementWatch = Stopwatch.StartNew();
|
||||
}
|
||||
|
||||
// Move cozmo in forward direction
|
||||
movement.Move(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4265d0764c65d26409f0f920e5293c82
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,35 @@
|
||||
///-----------------------------------------------------------------
|
||||
/// Namespace: <CozmoHelpers>
|
||||
/// Class: <SceneHelper>
|
||||
/// Description: <Used to deactivate specific objects that are only used in the sceneview not in the gameview>
|
||||
/// Author: <Tobias Hassel> Date: <29.07.2019>
|
||||
/// Notes: <>
|
||||
///-----------------------------------------------------------------
|
||||
///
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace CozmoHelpers
|
||||
{
|
||||
public class SceneHelper : MonoBehaviour
|
||||
{
|
||||
[Tooltip("All the objects in this list will be deactivated/activated when the game is running")]
|
||||
public List<GameObject> toggleInPlayMode;
|
||||
|
||||
|
||||
public void Awake()
|
||||
{
|
||||
ToggleObjectList();
|
||||
}
|
||||
|
||||
// Deactivate/Activate all gameObjects referenced in the toggleInPlayMode list
|
||||
private void ToggleObjectList()
|
||||
{
|
||||
foreach (GameObject go in toggleInPlayMode)
|
||||
{
|
||||
go.SetActive(!go.activeSelf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc64682be4f86884ebe75488344a51b2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1da60215cacd462438eae4718c228f73
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9019794d9e0b39645a29c012bfe3adcb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 6.9 KiB |
@@ -0,0 +1,88 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e2f202a27eca89449af658ee823922fb
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 459 KiB |
@@ -0,0 +1,88 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 199bbc3b06fa73149b6e1ad35ae6d936
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09e41ca9f5a54064f8def1c95e27fd08
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fe96f34bf245cba42abda9c0a289dbaa
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,77 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Schachbrett_10cm
|
||||
m_Shader: {fileID: 10752, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 199bbc3b06fa73149b6e1ad35ae6d936, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 645644d2cbab7d24bb1a6a693e8e6082
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 9.1 KiB |
@@ -0,0 +1,99 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cc90c9868898fb4499e99837f404fcdc
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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: 16
|
||||
mipBias: -100
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6760c1e7d4ebde3478dc8ab260ea9f04
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,34 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!84 &8400000
|
||||
RenderTexture:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: CozmoCannyCroped_0
|
||||
m_ImageContentsHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
m_ForcedFallbackFormat: 4
|
||||
m_DownscaleFallback: 0
|
||||
m_Width: 80
|
||||
m_Height: 30
|
||||
m_AntiAliasing: 1
|
||||
m_DepthFormat: 2
|
||||
m_ColorFormat: 0
|
||||
m_MipMap: 0
|
||||
m_GenerateMips: 1
|
||||
m_SRGB: 0
|
||||
m_UseDynamicScale: 0
|
||||
m_BindMS: 0
|
||||
m_TextureSettings:
|
||||
serializedVersion: 2
|
||||
m_FilterMode: 1
|
||||
m_Aniso: 0
|
||||
m_MipBias: 0
|
||||
m_WrapU: 1
|
||||
m_WrapV: 1
|
||||
m_WrapW: 1
|
||||
m_Dimension: 2
|
||||
m_VolumeDepth: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8bf12f4401860c043a77209428e97b29
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 8400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,34 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!84 &8400000
|
||||
RenderTexture:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: CozmoCannyCroped_1
|
||||
m_ImageContentsHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
m_ForcedFallbackFormat: 4
|
||||
m_DownscaleFallback: 0
|
||||
m_Width: 80
|
||||
m_Height: 30
|
||||
m_AntiAliasing: 1
|
||||
m_DepthFormat: 2
|
||||
m_ColorFormat: 0
|
||||
m_MipMap: 0
|
||||
m_GenerateMips: 1
|
||||
m_SRGB: 0
|
||||
m_UseDynamicScale: 0
|
||||
m_BindMS: 0
|
||||
m_TextureSettings:
|
||||
serializedVersion: 2
|
||||
m_FilterMode: 1
|
||||
m_Aniso: 0
|
||||
m_MipBias: 0
|
||||
m_WrapU: 1
|
||||
m_WrapV: 1
|
||||
m_WrapW: 1
|
||||
m_Dimension: 2
|
||||
m_VolumeDepth: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c2570513b195a074d9ddc7c75b245858
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 8400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,34 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!84 &8400000
|
||||
RenderTexture:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: CozmoCannyTexture_0
|
||||
m_ImageContentsHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
m_ForcedFallbackFormat: 4
|
||||
m_DownscaleFallback: 0
|
||||
m_Width: 320
|
||||
m_Height: 240
|
||||
m_AntiAliasing: 1
|
||||
m_DepthFormat: 2
|
||||
m_ColorFormat: 0
|
||||
m_MipMap: 0
|
||||
m_GenerateMips: 1
|
||||
m_SRGB: 0
|
||||
m_UseDynamicScale: 0
|
||||
m_BindMS: 0
|
||||
m_TextureSettings:
|
||||
serializedVersion: 2
|
||||
m_FilterMode: 1
|
||||
m_Aniso: 0
|
||||
m_MipBias: 0
|
||||
m_WrapU: 1
|
||||
m_WrapV: 1
|
||||
m_WrapW: 1
|
||||
m_Dimension: 2
|
||||
m_VolumeDepth: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 196f45b12806aaa449adc2ee1ca3b091
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 8400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,34 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!84 &8400000
|
||||
RenderTexture:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: CozmoCannyTexture_1
|
||||
m_ImageContentsHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
m_ForcedFallbackFormat: 4
|
||||
m_DownscaleFallback: 0
|
||||
m_Width: 320
|
||||
m_Height: 240
|
||||
m_AntiAliasing: 1
|
||||
m_DepthFormat: 2
|
||||
m_ColorFormat: 0
|
||||
m_MipMap: 0
|
||||
m_GenerateMips: 1
|
||||
m_SRGB: 0
|
||||
m_UseDynamicScale: 0
|
||||
m_BindMS: 0
|
||||
m_TextureSettings:
|
||||
serializedVersion: 2
|
||||
m_FilterMode: 1
|
||||
m_Aniso: 0
|
||||
m_MipBias: 0
|
||||
m_WrapU: 1
|
||||
m_WrapV: 1
|
||||
m_WrapW: 1
|
||||
m_Dimension: 2
|
||||
m_VolumeDepth: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 55aff4f34c0a7134eae7f9be35397deb
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 8400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cab51972497b97040814f06bb409e7c0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa7ea7fa4ff2dea4eaf717b9f695b516
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a667ec11dafd88c4882174cec99ff9bd
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.9 KiB |
@@ -0,0 +1,76 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fbee1fddc738f410ea0b37fe6301d7c0
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -1
|
||||
wrapU: -1
|
||||
wrapV: -1
|
||||
wrapW: -1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
spritePackingTag:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
@@ -0,0 +1,76 @@
|
||||
fileFormatVersion: 2
|
||||
guid: aff60a06d6c704801a2d09a8e72cbefc
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -1
|
||||
wrapU: -1
|
||||
wrapV: -1
|
||||
wrapW: -1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
spritePackingTag:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
@@ -0,0 +1,76 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 224cd0666bb7b4477b0806fd29cf5966
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
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
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -1
|
||||
wrapU: -1
|
||||
wrapV: -1
|
||||
wrapW: -1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
spritePackingTag:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 11630fa83cc8b4194b94352e3e6cdb9d
|
||||
folderAsset: yes
|
||||
timeCreated: 1504127524
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 67b4fb0b937cc471eae742addf6bda86
|
||||
folderAsset: yes
|
||||
timeCreated: 1503177274
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,115 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
namespace MLAgents
|
||||
{
|
||||
/*
|
||||
This code is meant to modify the behavior of the inspector on Brain Components.
|
||||
Depending on the type of brain that is used, the available fields will be modified in the inspector accordingly.
|
||||
*/
|
||||
[CustomEditor(typeof(Agent), true)]
|
||||
[CanEditMultipleObjects]
|
||||
public class AgentEditor : Editor
|
||||
{
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
SerializedObject serializedAgent = serializedObject;
|
||||
serializedAgent.Update();
|
||||
|
||||
SerializedProperty brain = serializedAgent.FindProperty("brain");
|
||||
SerializedProperty actionsPerDecision = serializedAgent.FindProperty(
|
||||
"agentParameters.numberOfActionsBetweenDecisions");
|
||||
SerializedProperty maxSteps = serializedAgent.FindProperty(
|
||||
"agentParameters.maxStep");
|
||||
SerializedProperty isResetOnDone = serializedAgent.FindProperty(
|
||||
"agentParameters.resetOnDone");
|
||||
SerializedProperty isODD = serializedAgent.FindProperty(
|
||||
"agentParameters.onDemandDecision");
|
||||
SerializedProperty cameras = serializedAgent.FindProperty(
|
||||
"agentParameters.agentCameras");
|
||||
SerializedProperty renderTextures = serializedAgent.FindProperty(
|
||||
"agentParameters.agentRenderTextures");
|
||||
|
||||
EditorGUILayout.PropertyField(brain);
|
||||
|
||||
if (cameras.arraySize > 0 && renderTextures.arraySize > 0)
|
||||
{
|
||||
EditorGUILayout.HelpBox("Brain visual observations created by first getting all cameras then all render textures.", MessageType.Info);
|
||||
}
|
||||
|
||||
EditorGUILayout.LabelField("Agent Cameras");
|
||||
for (int i = 0; i < cameras.arraySize; i++)
|
||||
{
|
||||
EditorGUILayout.PropertyField(
|
||||
cameras.GetArrayElementAtIndex(i),
|
||||
new GUIContent("Camera " + (i + 1).ToString() + ": "));
|
||||
}
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("Add Camera", EditorStyles.miniButton))
|
||||
{
|
||||
cameras.arraySize++;
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Remove Camera", EditorStyles.miniButton))
|
||||
{
|
||||
cameras.arraySize--;
|
||||
}
|
||||
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
EditorGUILayout.LabelField("Agent RenderTextures");
|
||||
for (int i = 0; i < renderTextures.arraySize; i++)
|
||||
{
|
||||
EditorGUILayout.PropertyField(
|
||||
renderTextures.GetArrayElementAtIndex(i),
|
||||
new GUIContent("RenderTexture " + (i + 1).ToString() + ": "));
|
||||
}
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("Add RenderTextures", EditorStyles.miniButton))
|
||||
{
|
||||
renderTextures.arraySize++;
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Remove RenderTextures", EditorStyles.miniButton))
|
||||
{
|
||||
renderTextures.arraySize--;
|
||||
}
|
||||
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
|
||||
EditorGUILayout.PropertyField(
|
||||
maxSteps,
|
||||
new GUIContent(
|
||||
"Max Step", "The per-agent maximum number of steps."));
|
||||
EditorGUILayout.PropertyField(
|
||||
isResetOnDone,
|
||||
new GUIContent(
|
||||
"Reset On Done",
|
||||
"If checked, the agent will reset on done. Else, AgentOnDone() will be called."));
|
||||
EditorGUILayout.PropertyField(
|
||||
isODD,
|
||||
new GUIContent(
|
||||
"On Demand Decisions",
|
||||
"If checked, you must manually request decisions."));
|
||||
if (!isODD.boolValue)
|
||||
{
|
||||
EditorGUILayout.PropertyField(
|
||||
actionsPerDecision,
|
||||
new GUIContent(
|
||||
"Decision Interval",
|
||||
"The agent will automatically request a decision every X" +
|
||||
" steps and perform an action at every step."));
|
||||
actionsPerDecision.intValue = Mathf.Max(1, actionsPerDecision.intValue);
|
||||
}
|
||||
|
||||
serializedAgent.ApplyModifiedProperties();
|
||||
|
||||
EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
|
||||
base.OnInspectorGUI();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c3b291e1cd0c64781861652b579d0ac1
|
||||
timeCreated: 1503270350
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,36 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
|
||||
namespace MLAgents
|
||||
{
|
||||
/// <summary>
|
||||
/// CustomEditor for the Brain base class. Defines the default Inspector view for a Brain.
|
||||
/// Shows the BrainParameters of the Brain and expose a tool to deep copy BrainParameters
|
||||
/// between brains.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(Brain))]
|
||||
public class BrainEditor : Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
var brain = (Brain) target;
|
||||
var brainToCopy = EditorGUILayout.ObjectField(
|
||||
"Copy Brain Parameters from : ", null, typeof(Brain), false) as Brain;
|
||||
if (brainToCopy != null)
|
||||
{
|
||||
brain.brainParameters = brainToCopy.brainParameters.Clone();
|
||||
EditorUtility.SetDirty(brain);
|
||||
AssetDatabase.SaveAssets();
|
||||
return;
|
||||
}
|
||||
var serializedBrain = serializedObject;
|
||||
serializedBrain.Update();
|
||||
EditorGUILayout.PropertyField(serializedBrain.FindProperty("brainParameters"), true);
|
||||
serializedBrain.ApplyModifiedProperties();
|
||||
|
||||
// Draws a horizontal thick line
|
||||
EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7b07bebd03994ed08559c725da882b62
|
||||
timeCreated: 1537834304
|
||||
@@ -0,0 +1,369 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
namespace MLAgents
|
||||
{
|
||||
/// <summary>
|
||||
/// PropertyDrawer for BrainParameters. Defines how BrainParameters are displayed in the
|
||||
/// Inspector.
|
||||
/// </summary>
|
||||
[CustomPropertyDrawer(typeof(BrainParameters))]
|
||||
public class BrainParametersDrawer : PropertyDrawer
|
||||
{
|
||||
// The height of a line in the Unity Inspectors
|
||||
private const float LineHeight = 17f;
|
||||
private const int VecObsNumLine = 3;
|
||||
private const string CamResPropName = "cameraResolutions";
|
||||
private const string ActionSizePropName = "vectorActionSize";
|
||||
private const string ActionTypePropName = "vectorActionSpaceType";
|
||||
private const string ActionDescriptionPropName = "vectorActionDescriptions";
|
||||
private const string VecObsPropName = "vectorObservationSize";
|
||||
private const string NumVecObsPropName ="numStackedVectorObservations";
|
||||
private const string CamWidthPropName = "width";
|
||||
private const string CamHeightPropName = "height";
|
||||
private const string CamGrayPropName = "blackAndWhite";
|
||||
private const int DefaultCameraWidth = 84;
|
||||
private const int DefaultCameraHeight = 84;
|
||||
private const bool DefaultCameraGray = false;
|
||||
|
||||
/// <inheritdoc />
|
||||
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
||||
{
|
||||
if (property.isExpanded)
|
||||
{
|
||||
return LineHeight +
|
||||
GetHeightDrawVectorObservation() +
|
||||
GetHeightDrawVisualObservation(property) +
|
||||
GetHeightDrawVectorAction(property) +
|
||||
GetHeightDrawVectorActionDescriptions(property);
|
||||
}
|
||||
return LineHeight;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
var indent = EditorGUI.indentLevel;
|
||||
EditorGUI.indentLevel = 0;
|
||||
position.height = LineHeight;
|
||||
property.isExpanded = EditorGUI.Foldout(position, property.isExpanded, label);
|
||||
position.y += LineHeight;
|
||||
if (property.isExpanded)
|
||||
{
|
||||
EditorGUI.BeginProperty(position, label, property);
|
||||
EditorGUI.indentLevel++;
|
||||
|
||||
// Vector Observations
|
||||
DrawVectorObservation(position, property);
|
||||
position.y += GetHeightDrawVectorObservation();
|
||||
|
||||
//Visual Observations
|
||||
DrawVisualObservations(position, property);
|
||||
position.y += GetHeightDrawVisualObservation(property);
|
||||
|
||||
// Vector Action
|
||||
DrawVectorAction(position, property);
|
||||
position.y += GetHeightDrawVectorAction(property);
|
||||
|
||||
// Vector Action Descriptions
|
||||
DrawVectorActionDescriptions(position, property);
|
||||
position.y += GetHeightDrawVectorActionDescriptions(property);
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
EditorGUI.indentLevel = indent;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the Vector Observations for the Brain Parameters
|
||||
/// </summary>
|
||||
/// <param name="position">Rectangle on the screen to use for the property GUI.</param>
|
||||
/// <param name="property">The SerializedProperty of the BrainParameters
|
||||
/// to make the custom GUI for.</param>
|
||||
private static void DrawVectorObservation(Rect position, SerializedProperty property)
|
||||
{
|
||||
EditorGUI.LabelField(position, "Vector Observation");
|
||||
position.y += LineHeight;
|
||||
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUI.PropertyField(position,
|
||||
property.FindPropertyRelative(VecObsPropName),
|
||||
new GUIContent("Space Size",
|
||||
"Length of state " +
|
||||
"vector for brain (In Continuous state space)." +
|
||||
"Or number of possible values (in Discrete state space)."));
|
||||
position.y += LineHeight;
|
||||
|
||||
EditorGUI.PropertyField(position,
|
||||
property.FindPropertyRelative(NumVecObsPropName),
|
||||
new GUIContent("Stacked Vectors",
|
||||
"Number of states that will be stacked before " +
|
||||
"being fed to the neural network."));
|
||||
position.y += LineHeight;
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The Height required to draw the Vector Observations paramaters
|
||||
/// </summary>
|
||||
/// <returns>The height of the drawer of the Vector Observations </returns>
|
||||
private static float GetHeightDrawVectorObservation()
|
||||
{
|
||||
return VecObsNumLine * LineHeight;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the Visual Observations parameters for the Brain Parameters
|
||||
/// </summary>
|
||||
/// <param name="position">Rectangle on the screen to use for the property GUI.</param>
|
||||
/// <param name="property">The SerializedProperty of the BrainParameters
|
||||
/// to make the custom GUI for.</param>
|
||||
private static void DrawVisualObservations(Rect position, SerializedProperty property)
|
||||
{
|
||||
EditorGUI.LabelField(position, "Visual Observations");
|
||||
position.y += LineHeight;
|
||||
var quarter = position.width / 4;
|
||||
var resolutions = property.FindPropertyRelative(CamResPropName);
|
||||
DrawVisualObsButtons(position, resolutions);
|
||||
position.y += LineHeight;
|
||||
|
||||
// Display the labels for the columns : Index, Width, Height and Gray
|
||||
var indexRect = new Rect(position.x, position.y, quarter, position.height);
|
||||
var widthRect = new Rect(position.x + quarter, position.y, quarter, position.height);
|
||||
var heightRect = new Rect(position.x + 2*quarter, position.y, quarter, position.height);
|
||||
var bwRect = new Rect(position.x + 3*quarter, position.y, quarter, position.height);
|
||||
EditorGUI.indentLevel++;
|
||||
if (resolutions.arraySize > 0)
|
||||
{
|
||||
EditorGUI.LabelField(indexRect, "Index");
|
||||
indexRect.y += LineHeight;
|
||||
EditorGUI.LabelField(widthRect, "Width");
|
||||
widthRect.y += LineHeight;
|
||||
EditorGUI.LabelField(heightRect, "Height");
|
||||
heightRect.y += LineHeight;
|
||||
EditorGUI.LabelField(bwRect, "Gray");
|
||||
bwRect.y += LineHeight;
|
||||
}
|
||||
|
||||
// Iterate over the resolutions
|
||||
for (var i = 0; i < resolutions.arraySize; i++)
|
||||
{
|
||||
EditorGUI.LabelField(indexRect, "Obs " + i);
|
||||
indexRect.y += LineHeight;
|
||||
var res = resolutions.GetArrayElementAtIndex(i);
|
||||
var w = res.FindPropertyRelative("width");
|
||||
w.intValue = EditorGUI.IntField(widthRect, w.intValue);
|
||||
widthRect.y += LineHeight;
|
||||
var h = res.FindPropertyRelative("height");
|
||||
h.intValue = EditorGUI.IntField(heightRect, h.intValue);
|
||||
heightRect.y += LineHeight;
|
||||
var bw = res.FindPropertyRelative("blackAndWhite");
|
||||
bw.boolValue = EditorGUI.Toggle(bwRect, bw.boolValue);
|
||||
bwRect.y += LineHeight;
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the buttons to add and remove the visual observations parameters
|
||||
/// </summary>
|
||||
/// <param name="position">Rectangle on the screen to use for the property GUI.</param>
|
||||
/// <param name="resolutions">The SerializedProperty of the resolution array
|
||||
/// to make the custom GUI for.</param>
|
||||
private static void DrawVisualObsButtons(Rect position, SerializedProperty resolutions)
|
||||
{
|
||||
var widthEighth = position.width / 8;
|
||||
var addButtonRect = new Rect(position.x + widthEighth, position.y,
|
||||
3 * widthEighth, position.height);
|
||||
var removeButtonRect = new Rect(position.x + 4 * widthEighth, position.y,
|
||||
3 * widthEighth, position.height);
|
||||
if (resolutions.arraySize == 0)
|
||||
{
|
||||
addButtonRect.width *= 2;
|
||||
}
|
||||
// Display the buttons
|
||||
if (GUI.Button(addButtonRect, "Add New", EditorStyles.miniButton))
|
||||
{
|
||||
resolutions.arraySize += 1;
|
||||
var newRes = resolutions.GetArrayElementAtIndex(resolutions.arraySize - 1);
|
||||
newRes.FindPropertyRelative(CamWidthPropName).intValue = DefaultCameraWidth;
|
||||
newRes.FindPropertyRelative(CamHeightPropName).intValue = DefaultCameraHeight;
|
||||
newRes.FindPropertyRelative(CamGrayPropName).boolValue = DefaultCameraGray;
|
||||
|
||||
}
|
||||
if (resolutions.arraySize > 0)
|
||||
{
|
||||
if (GUI.Button(removeButtonRect, "Remove Last", EditorStyles.miniButton))
|
||||
{
|
||||
resolutions.arraySize -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The Height required to draw the Visual Observations parameters
|
||||
/// </summary>
|
||||
/// <returns>The height of the drawer of the Visual Observations </returns>
|
||||
private static float GetHeightDrawVisualObservation(SerializedProperty property)
|
||||
{
|
||||
var visObsSize = property.FindPropertyRelative(CamResPropName).arraySize + 2;
|
||||
if (property.FindPropertyRelative(CamResPropName).arraySize > 0)
|
||||
{
|
||||
visObsSize += 1;
|
||||
}
|
||||
return LineHeight * visObsSize;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the Vector Actions parameters for the Brain Parameters
|
||||
/// </summary>
|
||||
/// <param name="position">Rectangle on the screen to use for the property GUI.</param>
|
||||
/// <param name="property">The SerializedProperty of the BrainParameters
|
||||
/// to make the custom GUI for.</param>
|
||||
private static void DrawVectorAction(Rect position, SerializedProperty property)
|
||||
{
|
||||
EditorGUI.LabelField(position, "Vector Action");
|
||||
position.y += LineHeight;
|
||||
EditorGUI.indentLevel++;
|
||||
var bpVectorActionType = property.FindPropertyRelative(ActionTypePropName);
|
||||
EditorGUI.PropertyField(
|
||||
position,
|
||||
bpVectorActionType,
|
||||
new GUIContent("Space Type",
|
||||
"Corresponds to whether state vector contains a single integer (Discrete) " +
|
||||
"or a series of real-valued floats (Continuous)."));
|
||||
position.y += LineHeight;
|
||||
if (bpVectorActionType.enumValueIndex == 1)
|
||||
{
|
||||
DrawContinuousVectorAction(position, property);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawDiscreteVectorAction(position, property);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the Continuous Vector Actions parameters for the Brain Parameters
|
||||
/// </summary>
|
||||
/// <param name="position">Rectangle on the screen to use for the property GUI.</param>
|
||||
/// <param name="property">The SerializedProperty of the BrainParameters
|
||||
/// to make the custom GUI for.</param>
|
||||
private static void DrawContinuousVectorAction(Rect position, SerializedProperty property)
|
||||
{
|
||||
var vecActionSize = property.FindPropertyRelative(ActionSizePropName);
|
||||
vecActionSize.arraySize = 1;
|
||||
SerializedProperty continuousActionSize =
|
||||
vecActionSize.GetArrayElementAtIndex(0);
|
||||
EditorGUI.PropertyField(
|
||||
position,
|
||||
continuousActionSize,
|
||||
new GUIContent("Space Size", "Length of continuous action vector."));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the Discrete Vector Actions parameters for the Brain Parameters
|
||||
/// </summary>
|
||||
/// <param name="position">Rectangle on the screen to use for the property GUI.</param>
|
||||
/// <param name="property">The SerializedProperty of the BrainParameters
|
||||
/// to make the custom GUI for.</param>
|
||||
private static void DrawDiscreteVectorAction(Rect position, SerializedProperty property)
|
||||
{
|
||||
var vecActionSize = property.FindPropertyRelative(ActionSizePropName);
|
||||
vecActionSize.arraySize = EditorGUI.IntField(
|
||||
position, "Branches Size", vecActionSize.arraySize);
|
||||
position.y += LineHeight;
|
||||
position.x += 20;
|
||||
position.width -= 20;
|
||||
for (var branchIndex = 0;
|
||||
branchIndex < vecActionSize.arraySize;
|
||||
branchIndex++)
|
||||
{
|
||||
SerializedProperty branchActionSize =
|
||||
vecActionSize.GetArrayElementAtIndex(branchIndex);
|
||||
|
||||
EditorGUI.PropertyField(
|
||||
position,
|
||||
branchActionSize,
|
||||
new GUIContent("Branch " + branchIndex + " Size",
|
||||
"Number of possible actions for the branch number " + branchIndex + "."));
|
||||
position.y += LineHeight;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The Height required to draw the Vector Action parameters
|
||||
/// </summary>
|
||||
/// <returns>The height of the drawer of the Vector Action </returns>
|
||||
private static float GetHeightDrawVectorAction(SerializedProperty property)
|
||||
{
|
||||
var actionSize = 2 + property.FindPropertyRelative(ActionSizePropName).arraySize;
|
||||
if (property.FindPropertyRelative(ActionTypePropName).enumValueIndex == 0)
|
||||
{
|
||||
actionSize += 1;
|
||||
}
|
||||
return actionSize * LineHeight;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the Vector Actions descriptions for the Brain Parameters
|
||||
/// </summary>
|
||||
/// <param name="position">Rectangle on the screen to use for the property GUI.</param>
|
||||
/// <param name="property">The SerializedProperty of the BrainParameters
|
||||
/// to make the custom GUI for.</param>
|
||||
private static void DrawVectorActionDescriptions(Rect position, SerializedProperty property)
|
||||
{
|
||||
var bpVectorActionType = property.FindPropertyRelative(ActionTypePropName);
|
||||
var vecActionSize = property.FindPropertyRelative(ActionSizePropName);
|
||||
var numberOfDescriptions = 0;
|
||||
if (bpVectorActionType.enumValueIndex == 1)
|
||||
{
|
||||
numberOfDescriptions = vecActionSize.GetArrayElementAtIndex(0).intValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
numberOfDescriptions = vecActionSize.arraySize;
|
||||
}
|
||||
|
||||
EditorGUI.indentLevel++;
|
||||
var vecActionDescriptions =
|
||||
property.FindPropertyRelative(ActionDescriptionPropName);
|
||||
vecActionDescriptions.arraySize = numberOfDescriptions;
|
||||
if (bpVectorActionType.enumValueIndex == 1)
|
||||
{
|
||||
//Continuous case :
|
||||
EditorGUI.PropertyField(
|
||||
position,
|
||||
vecActionDescriptions,
|
||||
new GUIContent("Action Descriptions",
|
||||
"A list of strings used to name the available actionsm for the Brain."),
|
||||
true);
|
||||
position.y += LineHeight;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Discrete case :
|
||||
EditorGUI.PropertyField(
|
||||
position,
|
||||
vecActionDescriptions,
|
||||
new GUIContent("Branch Descriptions",
|
||||
"A list of strings used to name the available branches for the Brain."),
|
||||
true);
|
||||
position.y += LineHeight;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The Height required to draw the Action Descriptions
|
||||
/// </summary>
|
||||
/// <returns>The height of the drawer of the Action Descriptions </returns>
|
||||
private static float GetHeightDrawVectorActionDescriptions(SerializedProperty property)
|
||||
{
|
||||
var descriptionSize = 1;
|
||||
if (property.FindPropertyRelative(ActionDescriptionPropName).isExpanded)
|
||||
{
|
||||
var descriptions = property.FindPropertyRelative(ActionDescriptionPropName);
|
||||
descriptionSize += descriptions.arraySize + 1;
|
||||
}
|
||||
return descriptionSize * LineHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b060ae8e687cf49bcae88b24db17bfa6
|
||||
timeCreated: 1517291065
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,208 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using UnityEditor.SceneManagement;
|
||||
|
||||
namespace MLAgents
|
||||
{
|
||||
/// <summary>
|
||||
/// PropertyDrawer for BroadcastHub. Used to display the BroadcastHub in the Inspector.
|
||||
/// </summary>
|
||||
[CustomPropertyDrawer(typeof(BroadcastHub))]
|
||||
public class BroadcastHubDrawer : PropertyDrawer
|
||||
{
|
||||
private BroadcastHub _hub;
|
||||
// The height of a line in the Unity Inspectors
|
||||
private const float LineHeight = 17f;
|
||||
// The vertical space left below the BroadcastHub UI.
|
||||
private const float ExtraSpaceBelow = 10f;
|
||||
// The horizontal size of the Control checkbox
|
||||
private const int ControlSize = 80;
|
||||
|
||||
/// <summary>
|
||||
/// Computes the height of the Drawer depending on the property it is showing
|
||||
/// </summary>
|
||||
/// <param name="property">The property that is being drawn.</param>
|
||||
/// <param name="label">The label of the property being drawn.</param>
|
||||
/// <returns>The vertical space needed to draw the property.</returns>
|
||||
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
||||
{
|
||||
LazyInitializeHub(property, label);
|
||||
var numLines = _hub.Count + 2 + (_hub.Count > 0 ? 1 : 0);
|
||||
return (numLines) * LineHeight + ExtraSpaceBelow;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
LazyInitializeHub(property, label);
|
||||
position.height = LineHeight;
|
||||
EditorGUI.LabelField(position, new GUIContent(label.text,
|
||||
"The Broadcast Hub helps you define which Brains you want to expose to " +
|
||||
"the external process"));
|
||||
position.y += LineHeight;
|
||||
|
||||
EditorGUI.BeginProperty(position, label, property);
|
||||
|
||||
EditorGUI.indentLevel++;
|
||||
DrawAddRemoveButtons(position);
|
||||
position.y += LineHeight;
|
||||
|
||||
// This is the labels for each columns
|
||||
var brainWidth = position.width - ControlSize;
|
||||
var brainRect = new Rect(
|
||||
position.x, position.y, brainWidth, position.height);
|
||||
var controlRect = new Rect(
|
||||
position.x + brainWidth, position.y, ControlSize, position.height);
|
||||
if (_hub.Count > 0)
|
||||
{
|
||||
EditorGUI.LabelField(brainRect, "Brains");
|
||||
brainRect.y += LineHeight;
|
||||
EditorGUI.LabelField(controlRect, "Control");
|
||||
controlRect.y += LineHeight;
|
||||
controlRect.x += 15;
|
||||
}
|
||||
DrawBrains(brainRect, controlRect);
|
||||
EditorGUI.indentLevel--;
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the Add and Remove buttons.
|
||||
/// </summary>
|
||||
/// <param name="position">The position at which to draw.</param>
|
||||
private void DrawAddRemoveButtons(Rect position)
|
||||
{
|
||||
// This is the rectangle for the Add button
|
||||
var addButtonRect = position;
|
||||
addButtonRect.x += 20;
|
||||
if (_hub.Count > 0)
|
||||
{
|
||||
addButtonRect.width /= 2;
|
||||
addButtonRect.width -= 24;
|
||||
var buttonContent = new GUIContent(
|
||||
"Add New", "Add a new Brain to the Broadcast Hub");
|
||||
if (GUI.Button(addButtonRect, buttonContent, EditorStyles.miniButton))
|
||||
{
|
||||
MarkSceneAsDirty();
|
||||
AddBrain();
|
||||
}
|
||||
// This is the rectangle for the Remove button
|
||||
var removeButtonRect = position;
|
||||
removeButtonRect.x = position.width / 2 + 15;
|
||||
removeButtonRect.width = addButtonRect.width - 18;
|
||||
buttonContent = new GUIContent(
|
||||
"Remove Last", "Remove the last Brain from the Broadcast Hub");
|
||||
if (GUI.Button(removeButtonRect, buttonContent, EditorStyles.miniButton))
|
||||
{
|
||||
MarkSceneAsDirty();
|
||||
RemoveLastBrain();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
addButtonRect.width -= 50;
|
||||
var buttonContent = new GUIContent(
|
||||
"Add Brain to Broadcast Hub", "Add a new Brain to the Broadcast Hub");
|
||||
if (GUI.Button(addButtonRect, buttonContent, EditorStyles.miniButton))
|
||||
{
|
||||
MarkSceneAsDirty();
|
||||
AddBrain();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the Brain and Control checkbox for the brains contained in the BroadCastHub.
|
||||
/// </summary>
|
||||
/// <param name="brainRect">The Rect to draw the Brains.</param>
|
||||
/// <param name="controlRect">The Rect to draw the control checkbox.</param>
|
||||
private void DrawBrains(Rect brainRect, Rect controlRect)
|
||||
{
|
||||
for (var index = 0; index < _hub.Count; index++)
|
||||
{
|
||||
var exposedBrains = _hub.broadcastingBrains;
|
||||
var brain = exposedBrains[index];
|
||||
// This is the rectangle for the brain
|
||||
EditorGUI.BeginChangeCheck();
|
||||
var newBrain = EditorGUI.ObjectField(
|
||||
brainRect, brain, typeof(Brain), true) as Brain;
|
||||
brainRect.y += LineHeight;
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
MarkSceneAsDirty();
|
||||
_hub.broadcastingBrains.RemoveAt(index);
|
||||
var brainToInsert = exposedBrains.Contains(newBrain) ? null : newBrain;
|
||||
exposedBrains.Insert(index, brainToInsert);
|
||||
break;
|
||||
}
|
||||
// This is the Rectangle for the control checkbox
|
||||
EditorGUI.BeginChangeCheck();
|
||||
if (brain is LearningBrain)
|
||||
{
|
||||
var isTraining = _hub.IsControlled(brain);
|
||||
isTraining = EditorGUI.Toggle(controlRect, isTraining);
|
||||
_hub.SetControlled(brain, isTraining);
|
||||
}
|
||||
controlRect.y += LineHeight;
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
MarkSceneAsDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lazy initializes the Drawer with the property to be drawn.
|
||||
/// </summary>
|
||||
/// <param name="property">The SerializedProperty of the BroadcastHub
|
||||
/// to make the custom GUI for.</param>
|
||||
/// <param name="label">The label of this property.</param>
|
||||
private void LazyInitializeHub(SerializedProperty property, GUIContent label)
|
||||
{
|
||||
if (_hub != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var target = property.serializedObject.targetObject;
|
||||
_hub = fieldInfo.GetValue(target) as BroadcastHub;
|
||||
if (_hub == null)
|
||||
{
|
||||
_hub = new BroadcastHub();
|
||||
fieldInfo.SetValue(target, _hub);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Signals that the property has been modified and requires the scene to be saved for
|
||||
/// the changes to persist. Only works when the Editor is not playing.
|
||||
/// </summary>
|
||||
private static void MarkSceneAsDirty()
|
||||
{
|
||||
if (!EditorApplication.isPlaying)
|
||||
{
|
||||
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the last Brain from the BroadcastHub
|
||||
/// </summary>
|
||||
private void RemoveLastBrain()
|
||||
{
|
||||
if (_hub.Count > 0)
|
||||
{
|
||||
_hub.broadcastingBrains.RemoveAt(_hub.broadcastingBrains.Count - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a new Brain to the BroadcastHub. The value of this brain will not be initialized.
|
||||
/// </summary>
|
||||
private void AddBrain()
|
||||
{
|
||||
_hub.broadcastingBrains.Add(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: aa1bef9e5833447ab7251fc6f7a3a609
|
||||
timeCreated: 1536852419
|
||||
@@ -0,0 +1,95 @@
|
||||
using System.Text;
|
||||
using MLAgents;
|
||||
using UnityEditor;
|
||||
|
||||
/// <summary>
|
||||
/// Renders a custom UI for Demonstration Scriptable Object.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(Demonstration))]
|
||||
[CanEditMultipleObjects]
|
||||
public class DemonstrationEditor : Editor
|
||||
{
|
||||
SerializedProperty brainParameters;
|
||||
SerializedProperty demoMetaData;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
brainParameters = serializedObject.FindProperty("brainParameters");
|
||||
demoMetaData = serializedObject.FindProperty("metaData");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Renders Inspector UI for Demonstration metadata.
|
||||
/// </summary>
|
||||
void MakeMetaDataProperty(SerializedProperty property)
|
||||
{
|
||||
var nameProp = property.FindPropertyRelative("demonstrationName");
|
||||
var expProp = property.FindPropertyRelative("numberExperiences");
|
||||
var epiProp = property.FindPropertyRelative("numberEpisodes");
|
||||
var rewProp = property.FindPropertyRelative("meanReward");
|
||||
|
||||
var nameLabel = nameProp.displayName + ": " + nameProp.stringValue;
|
||||
var expLabel = expProp.displayName + ": " + expProp.intValue;
|
||||
var epiLabel = epiProp.displayName + ": " + epiProp.intValue;
|
||||
var rewLabel = rewProp.displayName + ": " + rewProp.floatValue;
|
||||
|
||||
EditorGUILayout.LabelField(nameLabel);
|
||||
EditorGUILayout.LabelField(expLabel);
|
||||
EditorGUILayout.LabelField(epiLabel);
|
||||
EditorGUILayout.LabelField(rewLabel);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructs label for action size array.
|
||||
/// </summary>
|
||||
static string BuildActionArrayLabel(SerializedProperty actionSizeProperty)
|
||||
{
|
||||
var actionSize = actionSizeProperty.arraySize;
|
||||
StringBuilder actionLabel = new StringBuilder("[ ");
|
||||
for (int i = 0; i < actionSize; i++)
|
||||
{
|
||||
actionLabel.Append(actionSizeProperty.GetArrayElementAtIndex(i).intValue);
|
||||
if (i < actionSize - 1)
|
||||
{
|
||||
actionLabel.Append(", ");
|
||||
}
|
||||
}
|
||||
|
||||
actionLabel.Append(" ]");
|
||||
return actionLabel.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Renders Inspector UI for Brain Parameters of Demonstration.
|
||||
/// </summary>
|
||||
void MakeBrainParametersProperty(SerializedProperty property)
|
||||
{
|
||||
var vecObsSizeProp = property.FindPropertyRelative("vectorObservationSize");
|
||||
var numStackedProp = property.FindPropertyRelative("numStackedVectorObservations");
|
||||
var actSizeProperty = property.FindPropertyRelative("vectorActionSize");
|
||||
var camResProp = property.FindPropertyRelative("cameraResolutions");
|
||||
var actSpaceTypeProp = property.FindPropertyRelative("vectorActionSpaceType");
|
||||
|
||||
var vecObsSizeLabel = vecObsSizeProp.displayName + ": " + vecObsSizeProp.intValue;
|
||||
var numStackedLabel = numStackedProp.displayName + ": " + numStackedProp.intValue;
|
||||
var vecActSizeLabel = actSizeProperty.displayName + ": " + BuildActionArrayLabel(actSizeProperty);
|
||||
var camResLabel = camResProp.displayName + ": " + camResProp.arraySize;
|
||||
var actSpaceTypeLabel = actSpaceTypeProp.displayName + ": " + (SpaceType) actSpaceTypeProp.enumValueIndex;
|
||||
|
||||
EditorGUILayout.LabelField(vecObsSizeLabel);
|
||||
EditorGUILayout.LabelField(numStackedLabel);
|
||||
EditorGUILayout.LabelField(vecActSizeLabel);
|
||||
EditorGUILayout.LabelField(camResLabel);
|
||||
EditorGUILayout.LabelField(actSpaceTypeLabel);
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
EditorGUILayout.LabelField("Meta Data", EditorStyles.boldLabel);
|
||||
MakeMetaDataProperty(demoMetaData);
|
||||
EditorGUILayout.LabelField("Brain Parameters", EditorStyles.boldLabel);
|
||||
MakeBrainParametersProperty(brainParameters);
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 84f9cd83f56c74790a51444a6cfe4945
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using MLAgents.CommunicatorObjects;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEditor.Experimental.AssetImporters;
|
||||
|
||||
namespace MLAgents
|
||||
{
|
||||
/// <summary>
|
||||
/// Asset Importer used to parse demonstration files.
|
||||
/// </summary>
|
||||
[ScriptedImporter(1, new[] {"demo"})]
|
||||
public class DemonstrationImporter : ScriptedImporter
|
||||
{
|
||||
private const string IconPath = "Assets/ML-Agents/Resources/DemoIcon.png";
|
||||
|
||||
public override void OnImportAsset(AssetImportContext ctx)
|
||||
{
|
||||
var inputType = Path.GetExtension(ctx.assetPath);
|
||||
if (inputType == null)
|
||||
{
|
||||
throw new Exception("Demonstration import error.");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Read first two proto objects containing metadata and brain parameters.
|
||||
Stream reader = File.OpenRead(ctx.assetPath);
|
||||
|
||||
var metaDataProto = DemonstrationMetaProto.Parser.ParseDelimitedFrom(reader);
|
||||
var metaData = new DemonstrationMetaData(metaDataProto);
|
||||
|
||||
reader.Seek(DemonstrationStore.MetaDataBytes + 1, 0);
|
||||
var brainParamsProto = BrainParametersProto.Parser.ParseDelimitedFrom(reader);
|
||||
var brainParameters = new BrainParameters(brainParamsProto);
|
||||
|
||||
reader.Close();
|
||||
|
||||
var demonstration = ScriptableObject.CreateInstance<Demonstration>();
|
||||
demonstration.Initialize(brainParameters, metaData);
|
||||
userData = demonstration.ToString();
|
||||
|
||||
Texture2D texture = (Texture2D)
|
||||
AssetDatabase.LoadAssetAtPath(IconPath, typeof(Texture2D));
|
||||
|
||||
#if UNITY_2017_3_OR_NEWER
|
||||
ctx.AddObjectToAsset(ctx.assetPath, demonstration, texture);
|
||||
ctx.SetMainObject(demonstration);
|
||||
#else
|
||||
ctx.SetMainAsset(ctx.assetPath, model);
|
||||
#endif
|
||||
}
|
||||
catch
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user