Compare commits
5 Commits
4593b3714c
...
feat/throw
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a9314979ad | ||
|
|
1dbc2734f3 | ||
|
|
67a1717b86 | ||
|
|
94e44ad7af | ||
|
|
8c4c2b372b |
8
AGENTS.md
Normal file
8
AGENTS.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<!-- UNITY CODE ASSIST INSTRUCTIONS START -->
|
||||||
|
- Project name: HeadlessHazard
|
||||||
|
- Unity version: Unity 6000.3.10f1
|
||||||
|
- Active game object:
|
||||||
|
- Name: Head
|
||||||
|
- Tag: Player
|
||||||
|
- Layer: Default
|
||||||
|
<!-- UNITY CODE ASSIST INSTRUCTIONS END -->
|
||||||
141
Assets/Art/Materials/Player/Trajectory Material.mat
Normal file
141
Assets/Art/Materials/Player/Trajectory Material.mat
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &-4017841189937380044
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
||||||
|
version: 10
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 8
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: Trajectory Material
|
||||||
|
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords:
|
||||||
|
- _SPECULAR_SETUP
|
||||||
|
- _SURFACE_TYPE_TRANSPARENT
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 4
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: 3000
|
||||||
|
stringTagMap:
|
||||||
|
RenderType: Transparent
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
- DepthOnly
|
||||||
|
- SHADOWCASTER
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _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}
|
||||||
|
- _SpecGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
|
- _AlphaClip: 0
|
||||||
|
- _AlphaToMask: 0
|
||||||
|
- _Blend: 0
|
||||||
|
- _BlendModePreserveSpecular: 0
|
||||||
|
- _BumpScale: 1
|
||||||
|
- _ClearCoatMask: 0
|
||||||
|
- _ClearCoatSmoothness: 0
|
||||||
|
- _Cull: 2
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailAlbedoMapScale: 1
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DstBlend: 10
|
||||||
|
- _DstBlendAlpha: 10
|
||||||
|
- _EnvironmentReflections: 1
|
||||||
|
- _GlossMapScale: 0
|
||||||
|
- _Glossiness: 0
|
||||||
|
- _GlossyReflections: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.005
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _ReceiveShadows: 1
|
||||||
|
- _Smoothness: 0.5
|
||||||
|
- _SmoothnessTextureChannel: 0
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 5
|
||||||
|
- _SrcBlendAlpha: 1
|
||||||
|
- _Surface: 1
|
||||||
|
- _WorkflowMode: 0
|
||||||
|
- _XRMotionVectorsPass: 1
|
||||||
|
- _ZWrite: 0
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 1, g: 0, b: 0, a: 0.6862745}
|
||||||
|
- _Color: {r: 1, g: 0, b: 0, a: 0.6862745}
|
||||||
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
8
Assets/Art/Materials/Player/Trajectory Material.mat.meta
Normal file
8
Assets/Art/Materials/Player/Trajectory Material.mat.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 51588d9f6325eb54eaa0c67389672860
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
"initialStateCheck": true
|
"initialStateCheck": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Pickup",
|
"name": "HeadInteract",
|
||||||
"type": "Button",
|
"type": "Button",
|
||||||
"id": "5a0c555a-8fc4-4188-9eed-401eb8f017b5",
|
"id": "5a0c555a-8fc4-4188-9eed-401eb8f017b5",
|
||||||
"expectedControlType": "",
|
"expectedControlType": "",
|
||||||
@@ -100,7 +100,16 @@
|
|||||||
"name": "Sprint",
|
"name": "Sprint",
|
||||||
"type": "Button",
|
"type": "Button",
|
||||||
"id": "641cd816-40e6-41b4-8c3d-04687c349290",
|
"id": "641cd816-40e6-41b4-8c3d-04687c349290",
|
||||||
"expectedControlType": "Button",
|
"expectedControlType": "",
|
||||||
|
"processors": "",
|
||||||
|
"interactions": "",
|
||||||
|
"initialStateCheck": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Shift",
|
||||||
|
"type": "Button",
|
||||||
|
"id": "082f2b53-d4e1-4cc7-b174-c2975cd57d3f",
|
||||||
|
"expectedControlType": "",
|
||||||
"processors": "",
|
"processors": "",
|
||||||
"interactions": "",
|
"interactions": "",
|
||||||
"initialStateCheck": false
|
"initialStateCheck": false
|
||||||
@@ -495,7 +504,7 @@
|
|||||||
{
|
{
|
||||||
"name": "",
|
"name": "",
|
||||||
"id": "05a519b8-f991-4f43-a438-fbe3db38625b",
|
"id": "05a519b8-f991-4f43-a438-fbe3db38625b",
|
||||||
"path": "<Mouse>/rightButton",
|
"path": "<Mouse>/leftButton",
|
||||||
"interactions": "",
|
"interactions": "",
|
||||||
"processors": "",
|
"processors": "",
|
||||||
"groups": ";Keyboard&Mouse",
|
"groups": ";Keyboard&Mouse",
|
||||||
@@ -510,7 +519,18 @@
|
|||||||
"interactions": "",
|
"interactions": "",
|
||||||
"processors": "",
|
"processors": "",
|
||||||
"groups": ";Keyboard&Mouse",
|
"groups": ";Keyboard&Mouse",
|
||||||
"action": "Pickup",
|
"action": "HeadInteract",
|
||||||
|
"isComposite": false,
|
||||||
|
"isPartOfComposite": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "",
|
||||||
|
"id": "768d31fb-914a-42c1-900b-45ff3725e46c",
|
||||||
|
"path": "<Keyboard>/shift",
|
||||||
|
"interactions": "",
|
||||||
|
"processors": "",
|
||||||
|
"groups": ";Touch;Keyboard&Mouse",
|
||||||
|
"action": "Shift",
|
||||||
"isComposite": false,
|
"isComposite": false,
|
||||||
"isPartOfComposite": false
|
"isPartOfComposite": false
|
||||||
}
|
}
|
||||||
|
|||||||
110
Assets/Code/Scripts/Player/PlayerHeadControll.cs
Normal file
110
Assets/Code/Scripts/Player/PlayerHeadControll.cs
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class PlayerHeadController : MonoBehaviour
|
||||||
|
{
|
||||||
|
public Transform Head;
|
||||||
|
public Transform CameraTransform;
|
||||||
|
|
||||||
|
public float ThrowForce = 10f;
|
||||||
|
public float PickupDistance = 3f;
|
||||||
|
|
||||||
|
public bool isHoldingHead = true;
|
||||||
|
|
||||||
|
private Rigidbody m_headRigidbody;
|
||||||
|
|
||||||
|
private Vector3 m_headInitialLocalPos;
|
||||||
|
private Quaternion m_headInitialLocalRot;
|
||||||
|
|
||||||
|
private Animator animator;
|
||||||
|
private PlayerInputController input;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
animator = GetComponent<Animator>();
|
||||||
|
input = GetComponent<PlayerInputController>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
Cursor.lockState = CursorLockMode.Locked;
|
||||||
|
|
||||||
|
m_headInitialLocalPos = Head.localPosition;
|
||||||
|
m_headInitialLocalRot = Head.localRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (input.HeadInteractionPressed)
|
||||||
|
{
|
||||||
|
InteractHead();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.ThrowPressed)
|
||||||
|
{
|
||||||
|
ThrowHead();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InteractHead()
|
||||||
|
{
|
||||||
|
if (!isHoldingHead)
|
||||||
|
TryPickupHead();
|
||||||
|
else
|
||||||
|
DropHead();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DropHead()
|
||||||
|
{
|
||||||
|
animator.SetTrigger("Throw");
|
||||||
|
|
||||||
|
isHoldingHead = false;
|
||||||
|
|
||||||
|
Head.SetParent(null);
|
||||||
|
|
||||||
|
m_headRigidbody = Head.gameObject.AddComponent<Rigidbody>();
|
||||||
|
m_headRigidbody.mass = 1f;
|
||||||
|
|
||||||
|
m_headRigidbody.constraints =
|
||||||
|
RigidbodyConstraints.FreezeRotationX |
|
||||||
|
RigidbodyConstraints.FreezeRotationZ |
|
||||||
|
RigidbodyConstraints.FreezeRotationY;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ThrowHead()
|
||||||
|
{
|
||||||
|
if (!isHoldingHead)
|
||||||
|
return;
|
||||||
|
|
||||||
|
DropHead();
|
||||||
|
|
||||||
|
m_headRigidbody.AddForce(CameraTransform.forward * ThrowForce, ForceMode.Impulse);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TryPickupHead()
|
||||||
|
{
|
||||||
|
if (isHoldingHead)
|
||||||
|
return;
|
||||||
|
|
||||||
|
float distance = Vector3.Distance(transform.position, Head.position);
|
||||||
|
|
||||||
|
if (distance <= PickupDistance)
|
||||||
|
{
|
||||||
|
PickupHead();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PickupHead()
|
||||||
|
{
|
||||||
|
isHoldingHead = true;
|
||||||
|
|
||||||
|
if (m_headRigidbody != null)
|
||||||
|
{
|
||||||
|
Destroy(m_headRigidbody);
|
||||||
|
}
|
||||||
|
|
||||||
|
Head.SetParent(transform);
|
||||||
|
|
||||||
|
Head.localPosition = m_headInitialLocalPos;
|
||||||
|
Head.localRotation = m_headInitialLocalRot;
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Code/Scripts/Player/PlayerHeadControll.cs.meta
Normal file
2
Assets/Code/Scripts/Player/PlayerHeadControll.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2da51dfecccc45b469912e3bb3f1953b
|
||||||
55
Assets/Code/Scripts/Player/PlayerInputHandler.cs
Normal file
55
Assets/Code/Scripts/Player/PlayerInputHandler.cs
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
public class PlayerInputController : MonoBehaviour
|
||||||
|
{
|
||||||
|
public InputActionAsset InputActions;
|
||||||
|
|
||||||
|
private InputAction m_moveAction;
|
||||||
|
private InputAction m_lookAction;
|
||||||
|
private InputAction m_jumpAction;
|
||||||
|
private InputAction m_throwAction;
|
||||||
|
private InputAction m_shiftAction;
|
||||||
|
private InputAction m_headInteractAction;
|
||||||
|
|
||||||
|
public Vector2 MoveAmount { get; private set; }
|
||||||
|
public Vector2 LookAmount { get; private set; }
|
||||||
|
|
||||||
|
public bool JumpPressed { get; private set; }
|
||||||
|
public bool ShiftPressed { get; private set; }
|
||||||
|
public bool ThrowPressed { get; private set; }
|
||||||
|
public bool HeadInteractionPressed { get; private set; }
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
var map = InputActions.FindActionMap("Player");
|
||||||
|
|
||||||
|
m_moveAction = map.FindAction("Move");
|
||||||
|
m_lookAction = map.FindAction("Look");
|
||||||
|
m_jumpAction = map.FindAction("Jump");
|
||||||
|
m_shiftAction = map.FindAction("Shift");
|
||||||
|
m_throwAction = map.FindAction("Throw");
|
||||||
|
m_headInteractAction = map.FindAction("HeadInteract");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
InputActions.FindActionMap("Player").Enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDisable()
|
||||||
|
{
|
||||||
|
InputActions.FindActionMap("Player").Disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
MoveAmount = m_moveAction.ReadValue<Vector2>();
|
||||||
|
LookAmount = m_lookAction.ReadValue<Vector2>();
|
||||||
|
|
||||||
|
ShiftPressed = m_shiftAction.IsPressed();
|
||||||
|
JumpPressed = m_jumpAction.WasPressedThisFrame();
|
||||||
|
ThrowPressed = m_throwAction.WasPressedThisFrame();
|
||||||
|
HeadInteractionPressed = m_headInteractAction.WasPressedThisFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Code/Scripts/Player/PlayerInputHandler.cs.meta
Normal file
2
Assets/Code/Scripts/Player/PlayerInputHandler.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1d8f349ed7dc088a4a6e2690ee87094a
|
||||||
34
Assets/Code/Scripts/Player/PlayerJump.cs
Normal file
34
Assets/Code/Scripts/Player/PlayerJump.cs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class PlayerJump : MonoBehaviour
|
||||||
|
{
|
||||||
|
public float JumpForce = 5;
|
||||||
|
|
||||||
|
public Transform GroundCheck;
|
||||||
|
public float GroundCheckRadius = 0.2f;
|
||||||
|
|
||||||
|
private Rigidbody m_rigidbody;
|
||||||
|
private PlayerInputController input;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
m_rigidbody = GetComponent<Rigidbody>();
|
||||||
|
input = GetComponent<PlayerInputController>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
if (input.JumpPressed)
|
||||||
|
{
|
||||||
|
Jump();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Jump()
|
||||||
|
{
|
||||||
|
if (Physics.CheckSphere(GroundCheck.position, GroundCheckRadius, LayerMask.GetMask("Ground")))
|
||||||
|
{
|
||||||
|
m_rigidbody.AddForce(Vector3.up * JumpForce, ForceMode.Impulse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Code/Scripts/Player/PlayerJump.cs.meta
Normal file
2
Assets/Code/Scripts/Player/PlayerJump.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9c524d12bc1668e42a00cbd8050107f6
|
||||||
57
Assets/Code/Scripts/Player/PlayerLook.cs
Normal file
57
Assets/Code/Scripts/Player/PlayerLook.cs
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class PlayerLook : MonoBehaviour
|
||||||
|
{
|
||||||
|
public Transform CameraTransform;
|
||||||
|
public Transform Head;
|
||||||
|
|
||||||
|
public float RotateSpeed = 5;
|
||||||
|
public float MaxLookAngle = 90f;
|
||||||
|
|
||||||
|
private float m_verticalRotation = 0f;
|
||||||
|
|
||||||
|
private Rigidbody m_rigidbody;
|
||||||
|
private PlayerInputController input;
|
||||||
|
private PlayerHeadController headController;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
m_rigidbody = GetComponent<Rigidbody>();
|
||||||
|
input = GetComponent<PlayerInputController>();
|
||||||
|
headController = GetComponent<PlayerHeadController>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FixedUpdate()
|
||||||
|
{
|
||||||
|
Vector2 m_lookAmt = input.LookAmount;
|
||||||
|
|
||||||
|
if (m_lookAmt.magnitude <= 0.01f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!headController.isHoldingHead || input.ShiftPressed && headController.isHoldingHead)
|
||||||
|
{
|
||||||
|
float headRotation = m_lookAmt.x * RotateSpeed * Time.deltaTime;
|
||||||
|
Head.Rotate(0, headRotation, 0);
|
||||||
|
|
||||||
|
if (CameraTransform != null)
|
||||||
|
{
|
||||||
|
m_verticalRotation -= m_lookAmt.y * RotateSpeed * Time.deltaTime;
|
||||||
|
m_verticalRotation = Mathf.Clamp(m_verticalRotation, -MaxLookAngle, MaxLookAngle);
|
||||||
|
CameraTransform.localRotation = Quaternion.Euler(m_verticalRotation, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float horizontalRotation = m_lookAmt.x * RotateSpeed * Time.deltaTime;
|
||||||
|
Quaternion deltaRotation = Quaternion.Euler(0, horizontalRotation, 0);
|
||||||
|
m_rigidbody.MoveRotation(m_rigidbody.rotation * deltaRotation);
|
||||||
|
|
||||||
|
if (CameraTransform != null)
|
||||||
|
{
|
||||||
|
m_verticalRotation -= m_lookAmt.y * RotateSpeed * Time.deltaTime;
|
||||||
|
m_verticalRotation = Mathf.Clamp(m_verticalRotation, -MaxLookAngle, MaxLookAngle);
|
||||||
|
CameraTransform.localRotation = Quaternion.Euler(m_verticalRotation, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/Code/Scripts/Player/PlayerLook.cs.meta
Normal file
2
Assets/Code/Scripts/Player/PlayerLook.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6c1ddada0161b8c4783806ef6775348a
|
||||||
@@ -1,216 +1,74 @@
|
|||||||
using TMPro;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.InputSystem;
|
|
||||||
|
|
||||||
public class PlayerMovement : MonoBehaviour
|
public class PlayerMovement : MonoBehaviour
|
||||||
{
|
{
|
||||||
public InputActionAsset InputActions;
|
|
||||||
|
|
||||||
private InputAction m_moveAction;
|
|
||||||
private InputAction m_lookAction;
|
|
||||||
private InputAction m_jumpAction;
|
|
||||||
private InputAction m_throwAction;
|
|
||||||
private InputAction m_pickupAction;
|
|
||||||
|
|
||||||
private Vector2 m_moveAmt;
|
|
||||||
private Vector2 m_lookAmt;
|
|
||||||
|
|
||||||
private Rigidbody m_rigidbody;
|
|
||||||
|
|
||||||
[Header("Camera/Head")]
|
|
||||||
public Transform CameraTransform;
|
|
||||||
public float MaxLookAngle = 90f;
|
|
||||||
|
|
||||||
private float m_verticalRotation = 0f;
|
|
||||||
|
|
||||||
public float WalkSpeed = 10;
|
public float WalkSpeed = 10;
|
||||||
public float RotateSpeed = 5;
|
public float rotationSpeed = 10f;
|
||||||
public float JumpForce = 5;
|
|
||||||
|
|
||||||
public Transform GroundCheck;
|
|
||||||
public float GroundCheckRadius = 0.2f;
|
|
||||||
|
|
||||||
public Animator animator;
|
public Animator animator;
|
||||||
|
public Transform cameraTransform;
|
||||||
|
|
||||||
[Header("Head Settings")]
|
private Rigidbody m_rigidbody;
|
||||||
public Transform Head;
|
private PlayerInputController input;
|
||||||
public float ThrowForce = 10f;
|
private PlayerHeadController headController;
|
||||||
public float PickupDistance = 3f;
|
|
||||||
|
|
||||||
private bool m_isHeadThrown = false;
|
private Vector3 moveDirection;
|
||||||
private Rigidbody m_headRigidbody;
|
|
||||||
|
|
||||||
private Vector3 m_headInitialLocalPos;
|
|
||||||
private Quaternion m_headInitialLocalRot;
|
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
var map = InputActions.FindActionMap("Player");
|
|
||||||
|
|
||||||
m_moveAction = map.FindAction("Move");
|
|
||||||
m_lookAction = map.FindAction("Look");
|
|
||||||
m_jumpAction = map.FindAction("Jump");
|
|
||||||
// Support both old and new action names without breaking the scene setup.
|
|
||||||
m_throwAction = map.FindAction("Throw") ?? map.FindAction("Attack");
|
|
||||||
m_pickupAction = map.FindAction("Pickup") ?? map.FindAction("Interact");
|
|
||||||
|
|
||||||
m_rigidbody = GetComponent<Rigidbody>();
|
m_rigidbody = GetComponent<Rigidbody>();
|
||||||
|
input = GetComponent<PlayerInputController>();
|
||||||
animator = GetComponent<Animator>();
|
animator = GetComponent<Animator>();
|
||||||
}
|
headController = GetComponent<PlayerHeadController>();
|
||||||
|
|
||||||
private void OnEnable()
|
if (m_rigidbody != null)
|
||||||
{
|
|
||||||
InputActions.FindActionMap("Player").Enable();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnDisable()
|
|
||||||
{
|
|
||||||
InputActions.FindActionMap("Player").Disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Start()
|
|
||||||
{
|
|
||||||
Cursor.lockState = CursorLockMode.Locked;
|
|
||||||
m_headInitialLocalPos = Head.localPosition;
|
|
||||||
m_headInitialLocalRot = Head.localRotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Update()
|
|
||||||
{
|
|
||||||
m_moveAmt = m_moveAction != null ? m_moveAction.ReadValue<Vector2>() : Vector2.zero;
|
|
||||||
m_lookAmt = m_lookAction != null ? m_lookAction.ReadValue<Vector2>() : Vector2.zero;
|
|
||||||
|
|
||||||
if (m_jumpAction != null && m_jumpAction.WasPressedThisFrame())
|
|
||||||
{
|
{
|
||||||
Jump();
|
m_rigidbody.freezeRotation = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_throwAction != null && m_throwAction.WasPressedThisFrame())
|
|
||||||
{
|
|
||||||
ThrowHead();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_pickupAction != null && (m_pickupAction.WasPressedThisFrame() || m_pickupAction.WasPerformedThisFrame()))
|
|
||||||
{
|
|
||||||
TryPickupHead();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FixedUpdate()
|
private void FixedUpdate()
|
||||||
{
|
{
|
||||||
Walking();
|
Vector2 m_moveAmt = input.MoveAmount;
|
||||||
Rotating();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Walking()
|
float horizontal = m_moveAmt.x;
|
||||||
{
|
float vertical = m_moveAmt.y;
|
||||||
Vector3 move =
|
|
||||||
transform.forward * m_moveAmt.y +
|
|
||||||
transform.right * m_moveAmt.x;
|
|
||||||
|
|
||||||
m_rigidbody.MovePosition(
|
Vector3 cameraForward = cameraTransform.forward;
|
||||||
m_rigidbody.position + move * WalkSpeed * Time.deltaTime
|
Vector3 cameraRight = cameraTransform.right;
|
||||||
);
|
|
||||||
|
cameraForward.y = 0f;
|
||||||
|
cameraRight.y = 0f;
|
||||||
|
|
||||||
|
cameraForward.Normalize();
|
||||||
|
cameraRight.Normalize();
|
||||||
|
|
||||||
|
moveDirection = (cameraForward * vertical + cameraRight * horizontal).normalized;
|
||||||
|
|
||||||
|
if (headController.isHoldingHead)
|
||||||
|
{
|
||||||
|
m_rigidbody.MovePosition(
|
||||||
|
m_rigidbody.position + Time.deltaTime * WalkSpeed * moveDirection
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (moveDirection.magnitude >= 0.1f)
|
||||||
|
{
|
||||||
|
m_rigidbody.MovePosition(
|
||||||
|
m_rigidbody.position + Time.deltaTime * WalkSpeed * moveDirection
|
||||||
|
);
|
||||||
|
|
||||||
|
Quaternion targetRotation = Quaternion.LookRotation(moveDirection);
|
||||||
|
transform.rotation = Quaternion.Slerp(
|
||||||
|
transform.rotation,
|
||||||
|
targetRotation,
|
||||||
|
rotationSpeed * Time.deltaTime
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool isMoving = m_moveAmt.magnitude > 0.1f;
|
bool isMoving = m_moveAmt.magnitude > 0.1f;
|
||||||
animator.SetBool("isWalking", isMoving);
|
animator.SetBool("isWalking", isMoving);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void Rotating()
|
|
||||||
{
|
|
||||||
if (m_lookAmt.magnitude <= 0.01f)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!m_isHeadThrown)
|
|
||||||
{
|
|
||||||
// NORMAL BODY ROTATION
|
|
||||||
float horizontalRotation = m_lookAmt.x * RotateSpeed * Time.deltaTime;
|
|
||||||
Quaternion deltaRotation = Quaternion.Euler(0, horizontalRotation, 0);
|
|
||||||
m_rigidbody.MoveRotation(m_rigidbody.rotation * deltaRotation);
|
|
||||||
|
|
||||||
if (CameraTransform != null)
|
|
||||||
{
|
|
||||||
m_verticalRotation -= m_lookAmt.y * RotateSpeed * Time.deltaTime;
|
|
||||||
m_verticalRotation = Mathf.Clamp(m_verticalRotation, -MaxLookAngle, MaxLookAngle);
|
|
||||||
CameraTransform.localRotation = Quaternion.Euler(m_verticalRotation, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// HEAD ROTATION ON GROUND
|
|
||||||
float headRotation = m_lookAmt.x * RotateSpeed * Time.deltaTime;
|
|
||||||
Head.Rotate(0, headRotation, 0);
|
|
||||||
|
|
||||||
// Add vertical camera rotation when head is on ground
|
|
||||||
if (CameraTransform != null)
|
|
||||||
{
|
|
||||||
m_verticalRotation -= m_lookAmt.y * RotateSpeed * Time.deltaTime;
|
|
||||||
m_verticalRotation = Mathf.Clamp(m_verticalRotation, -MaxLookAngle, MaxLookAngle);
|
|
||||||
CameraTransform.localRotation = Quaternion.Euler(m_verticalRotation, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Jump()
|
|
||||||
{
|
|
||||||
if (Physics.CheckSphere(GroundCheck.position, GroundCheckRadius, LayerMask.GetMask("Ground"))) {
|
|
||||||
m_rigidbody.AddForce(Vector3.up * JumpForce, ForceMode.Impulse);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ThrowHead()
|
|
||||||
{
|
|
||||||
if (m_isHeadThrown)
|
|
||||||
return;
|
|
||||||
|
|
||||||
animator.SetTrigger("Throw");
|
|
||||||
|
|
||||||
m_isHeadThrown = true;
|
|
||||||
|
|
||||||
Head.SetParent(null);
|
|
||||||
|
|
||||||
m_headRigidbody = Head.gameObject.AddComponent<Rigidbody>();
|
|
||||||
m_headRigidbody.mass = 1f;
|
|
||||||
|
|
||||||
m_headRigidbody.constraints =
|
|
||||||
RigidbodyConstraints.FreezeRotationX |
|
|
||||||
RigidbodyConstraints.FreezeRotationZ;
|
|
||||||
|
|
||||||
m_headRigidbody.AddForce(CameraTransform.forward * ThrowForce, ForceMode.Impulse);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void TryPickupHead()
|
|
||||||
{
|
|
||||||
if (!m_isHeadThrown)
|
|
||||||
return;
|
|
||||||
|
|
||||||
float distance = Vector3.Distance(transform.position, Head.position);
|
|
||||||
|
|
||||||
if (distance <= PickupDistance)
|
|
||||||
{
|
|
||||||
PickupHead();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PickupHead()
|
|
||||||
{
|
|
||||||
m_isHeadThrown = false;
|
|
||||||
|
|
||||||
// Remove Rigidbody
|
|
||||||
if (m_headRigidbody != null)
|
|
||||||
{
|
|
||||||
Destroy(m_headRigidbody);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reattach to player
|
|
||||||
Head.SetParent(transform);
|
|
||||||
|
|
||||||
// Reset position & rotation
|
|
||||||
Head.localPosition = m_headInitialLocalPos;
|
|
||||||
Head.localRotation = m_headInitialLocalRot;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 1d8f349ed7dc088a4a6e2690ee87094a
|
guid: 7f91586e8c2742341aa8f6925e597bf1
|
||||||
216
Assets/Code/Scripts/Player/test.cs
Normal file
216
Assets/Code/Scripts/Player/test.cs
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
//using TMPro;
|
||||||
|
//using UnityEngine;
|
||||||
|
//using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
//public class PlayerMovement : MonoBehaviour
|
||||||
|
//{
|
||||||
|
// public InputActionAsset InputActions;
|
||||||
|
|
||||||
|
// private InputAction m_moveAction;
|
||||||
|
// private InputAction m_lookAction;
|
||||||
|
// private InputAction m_jumpAction;
|
||||||
|
// private InputAction m_throwAction;
|
||||||
|
// private InputAction m_pickupAction;
|
||||||
|
|
||||||
|
// private Vector2 m_moveAmt;
|
||||||
|
// private Vector2 m_lookAmt;
|
||||||
|
|
||||||
|
// private Rigidbody m_rigidbody;
|
||||||
|
|
||||||
|
// [Header("Camera/Head")]
|
||||||
|
// public Transform CameraTransform;
|
||||||
|
// public float MaxLookAngle = 90f;
|
||||||
|
|
||||||
|
// private float m_verticalRotation = 0f;
|
||||||
|
|
||||||
|
// public float WalkSpeed = 10;
|
||||||
|
// public float RotateSpeed = 5;
|
||||||
|
// public float JumpForce = 5;
|
||||||
|
|
||||||
|
// public Transform GroundCheck;
|
||||||
|
// public float GroundCheckRadius = 0.2f;
|
||||||
|
|
||||||
|
// public Animator animator;
|
||||||
|
|
||||||
|
// [Header("Head Settings")]
|
||||||
|
// public Transform Head;
|
||||||
|
// public float ThrowForce = 10f;
|
||||||
|
// public float PickupDistance = 3f;
|
||||||
|
|
||||||
|
// private bool m_isHeadThrown = false;
|
||||||
|
// private Rigidbody m_headRigidbody;
|
||||||
|
|
||||||
|
// private Vector3 m_headInitialLocalPos;
|
||||||
|
// private Quaternion m_headInitialLocalRot;
|
||||||
|
|
||||||
|
// private void Awake()
|
||||||
|
// {
|
||||||
|
// var map = InputActions.FindActionMap("Player");
|
||||||
|
|
||||||
|
// m_moveAction = map.FindAction("Move");
|
||||||
|
// m_lookAction = map.FindAction("Look");
|
||||||
|
// m_jumpAction = map.FindAction("Jump");
|
||||||
|
// m_throwAction = map.FindAction("Throw");
|
||||||
|
// m_pickupAction = map.FindAction("Pickup");
|
||||||
|
|
||||||
|
// m_rigidbody = GetComponent<Rigidbody>();
|
||||||
|
// animator = GetComponent<Animator>();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void OnEnable()
|
||||||
|
// {
|
||||||
|
// InputActions.FindActionMap("Player").Enable();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void OnDisable()
|
||||||
|
// {
|
||||||
|
// InputActions.FindActionMap("Player").Disable();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void Start()
|
||||||
|
// {
|
||||||
|
// Cursor.lockState = CursorLockMode.Locked;
|
||||||
|
// m_headInitialLocalPos = Head.localPosition;
|
||||||
|
// m_headInitialLocalRot = Head.localRotation;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void Update()
|
||||||
|
// {
|
||||||
|
// m_moveAmt = m_moveAction.ReadValue<Vector2>();
|
||||||
|
// m_lookAmt = m_lookAction.ReadValue<Vector2>();
|
||||||
|
|
||||||
|
// if (m_jumpAction.WasPressedThisFrame())
|
||||||
|
// {
|
||||||
|
// Jump();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (m_throwAction.WasPressedThisFrame())
|
||||||
|
// {
|
||||||
|
// ThrowHead();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (m_pickupAction.WasPressedThisFrame())
|
||||||
|
// {
|
||||||
|
// TryPickupHead();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void FixedUpdate()
|
||||||
|
// {
|
||||||
|
// Walking();
|
||||||
|
// Rotating();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void Walking()
|
||||||
|
// {
|
||||||
|
// Vector3 move =
|
||||||
|
// transform.forward * m_moveAmt.y +
|
||||||
|
// transform.right * m_moveAmt.x;
|
||||||
|
|
||||||
|
// m_rigidbody.MovePosition(
|
||||||
|
// m_rigidbody.position + move * WalkSpeed * Time.deltaTime
|
||||||
|
// );
|
||||||
|
|
||||||
|
// bool isMoving = m_moveAmt.magnitude > 0.1f;
|
||||||
|
// animator.SetBool("isWalking", isMoving);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// private void Rotating()
|
||||||
|
// {
|
||||||
|
// if (m_lookAmt.magnitude <= 0.01f)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// if (!m_isHeadThrown)
|
||||||
|
// {
|
||||||
|
// NORMAL BODY ROTATION
|
||||||
|
// float horizontalRotation = m_lookAmt.x * RotateSpeed * Time.deltaTime;
|
||||||
|
// Quaternion deltaRotation = Quaternion.Euler(0, horizontalRotation, 0);
|
||||||
|
// m_rigidbody.MoveRotation(m_rigidbody.rotation * deltaRotation);
|
||||||
|
|
||||||
|
// if (CameraTransform != null)
|
||||||
|
// {
|
||||||
|
// m_verticalRotation -= m_lookAmt.y * RotateSpeed * Time.deltaTime;
|
||||||
|
// m_verticalRotation = Mathf.Clamp(m_verticalRotation, -MaxLookAngle, MaxLookAngle);
|
||||||
|
// CameraTransform.localRotation = Quaternion.Euler(m_verticalRotation, 0, 0);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// HEAD ROTATION ON GROUND
|
||||||
|
// float headRotation = m_lookAmt.x * RotateSpeed * Time.deltaTime;
|
||||||
|
// Head.Rotate(0, headRotation, 0);
|
||||||
|
|
||||||
|
// Add vertical camera rotation when head is on ground
|
||||||
|
// if (CameraTransform != null)
|
||||||
|
// {
|
||||||
|
// m_verticalRotation -= m_lookAmt.y * RotateSpeed * Time.deltaTime;
|
||||||
|
// m_verticalRotation = Mathf.Clamp(m_verticalRotation, -MaxLookAngle, MaxLookAngle);
|
||||||
|
// CameraTransform.localRotation = Quaternion.Euler(m_verticalRotation, 0, 0);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public void Jump()
|
||||||
|
// {
|
||||||
|
// if (Physics.CheckSphere(GroundCheck.position, GroundCheckRadius, LayerMask.GetMask("Ground")))
|
||||||
|
// {
|
||||||
|
// m_rigidbody.AddForce(Vector3.up * JumpForce, ForceMode.Impulse);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void ThrowHead()
|
||||||
|
// {
|
||||||
|
// if (m_isHeadThrown)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// animator.SetTrigger("Throw");
|
||||||
|
|
||||||
|
// m_isHeadThrown = true;
|
||||||
|
|
||||||
|
// Head.SetParent(null);
|
||||||
|
|
||||||
|
// m_headRigidbody = Head.gameObject.AddComponent<Rigidbody>();
|
||||||
|
// m_headRigidbody.mass = 1f;
|
||||||
|
|
||||||
|
// m_headRigidbody.constraints =
|
||||||
|
// RigidbodyConstraints.FreezeRotationX |
|
||||||
|
// RigidbodyConstraints.FreezeRotationZ;
|
||||||
|
|
||||||
|
// m_headRigidbody.AddForce(CameraTransform.forward * ThrowForce, ForceMode.Impulse);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void TryPickupHead()
|
||||||
|
// {
|
||||||
|
// if (!m_isHeadThrown)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// float distance = Vector3.Distance(transform.position, Head.position);
|
||||||
|
|
||||||
|
// if (distance <= PickupDistance)
|
||||||
|
// {
|
||||||
|
// PickupHead();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void PickupHead()
|
||||||
|
// {
|
||||||
|
// m_isHeadThrown = false;
|
||||||
|
|
||||||
|
// Remove Rigidbody
|
||||||
|
// if (m_headRigidbody != null)
|
||||||
|
// {
|
||||||
|
// Destroy(m_headRigidbody);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Reattach to player
|
||||||
|
// Head.SetParent(transform);
|
||||||
|
|
||||||
|
// Reset position & rotation
|
||||||
|
// Head.localPosition = m_headInitialLocalPos;
|
||||||
|
// Head.localRotation = m_headInitialLocalRot;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
//}
|
||||||
2
Assets/Code/Scripts/Player/test.cs.meta
Normal file
2
Assets/Code/Scripts/Player/test.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 85fce5e45a2682243a133de9ba0a4324
|
||||||
@@ -13,7 +13,6 @@ GameObject:
|
|||||||
- component: {fileID: 7188501903215599936}
|
- component: {fileID: 7188501903215599936}
|
||||||
- component: {fileID: 2249752946204529007}
|
- component: {fileID: 2249752946204529007}
|
||||||
- component: {fileID: 8097217384448450469}
|
- component: {fileID: 8097217384448450469}
|
||||||
- component: {fileID: 3970929985668534253}
|
|
||||||
- component: {fileID: 9200216552899707794}
|
- component: {fileID: 9200216552899707794}
|
||||||
- component: {fileID: 3436190445336344638}
|
- component: {fileID: 3436190445336344638}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
@@ -34078,28 +34077,6 @@ MeshFilter:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 6532970485135766022}
|
m_GameObject: {fileID: 6532970485135766022}
|
||||||
m_Mesh: {fileID: 0}
|
m_Mesh: {fileID: 0}
|
||||||
--- !u!64 &3970929985668534253
|
|
||||||
MeshCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 6532970485135766022}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 5
|
|
||||||
m_Convex: 0
|
|
||||||
m_CookingOptions: 30
|
|
||||||
m_Mesh: {fileID: 0}
|
|
||||||
--- !u!135 &9200216552899707794
|
--- !u!135 &9200216552899707794
|
||||||
SphereCollider:
|
SphereCollider:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ GameObject:
|
|||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: GroundCheck
|
m_Name: GroundCheck
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0}
|
m_Icon: {fileID: 0}
|
||||||
m_NavMeshLayer: 0
|
m_NavMeshLayer: 0
|
||||||
m_StaticEditorFlags: 0
|
m_StaticEditorFlags: 0
|
||||||
m_IsActive: 1
|
m_IsActive: 1
|
||||||
@@ -25,7 +25,7 @@ Transform:
|
|||||||
m_GameObject: {fileID: 8021212901078439068}
|
m_GameObject: {fileID: 8021212901078439068}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
m_LocalPosition: {x: 0, y: 0, z: -0.06500006}
|
m_LocalPosition: {x: 0, y: 0.004, z: -0.06500006}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
@@ -39,21 +39,89 @@ PrefabInstance:
|
|||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TransformParent: {fileID: 7821156882341915560}
|
m_TransformParent: {fileID: 7821156882341915560}
|
||||||
m_Modifications:
|
m_Modifications:
|
||||||
|
- target: {fileID: 1316595833530241815, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 1316595833530241815, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 3733736632917204230, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 3733736632917204230, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 3733736632917204230, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 3866203678110391311, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 3866203678110391311, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 4513738306462009106, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
- target: {fileID: 4513738306462009106, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: Head
|
value: Head
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4513738306462009106, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_TagString
|
||||||
|
value: Player
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4522719369371878407, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4522719369371878407, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5926884563646191324, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5926884563646191324, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5926884563646191324, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7925603877176952742, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7925603877176952742, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8182261421342382278, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 1.235
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8182261421342382278, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0.3157
|
||||||
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
- target: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
- target: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 0
|
value: -0.421
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
- target: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
propertyPath: m_LocalPosition.z
|
propertyPath: m_LocalPosition.z
|
||||||
value: 0
|
value: 0.475
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
- target: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
propertyPath: m_LocalRotation.w
|
propertyPath: m_LocalRotation.w
|
||||||
@@ -83,11 +151,41 @@ PrefabInstance:
|
|||||||
propertyPath: m_LocalEulerAnglesHint.z
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents:
|
||||||
|
- {fileID: 9037390549028016567, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
m_AddedComponents: []
|
m_AddedComponents:
|
||||||
|
- targetCorrespondingSourceObject: {fileID: 4513738306462009106, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 6096268390463610501}
|
||||||
m_SourcePrefab: {fileID: 100100000, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
m_SourcePrefab: {fileID: 100100000, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
--- !u!1 &4446703388580953019 stripped
|
||||||
|
GameObject:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 4513738306462009106, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 221195622690684073}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
--- !u!65 &6096268390463610501
|
||||||
|
BoxCollider:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 4446703388580953019}
|
||||||
|
m_Material: {fileID: 13400000, guid: 0e9f85473ca372a59bbff5adb28c18d2, type: 2}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_LayerOverridePriority: 0
|
||||||
|
m_IsTrigger: 0
|
||||||
|
m_ProvidesContacts: 0
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_Size: {x: 0.79742086, y: 0.5844476, z: 0.75984764}
|
||||||
|
m_Center: {x: -0.0018145442, y: 1.2922238, z: 0.060781002}
|
||||||
--- !u!4 &8079687630579216978 stripped
|
--- !u!4 &8079687630579216978 stripped
|
||||||
Transform:
|
Transform:
|
||||||
m_CorrespondingSourceObject: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
m_CorrespondingSourceObject: {fileID: 8300425658720571131, guid: 8ae6d0072edd3ef6a8e8fab748ba5098, type: 3}
|
||||||
@@ -151,10 +249,32 @@ PrefabInstance:
|
|||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects:
|
||||||
|
- {fileID: 2059550454731354505, guid: 459ef74c4ee79d3eb8e1ba6a0f06c9a7, type: 3}
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
m_AddedComponents: []
|
m_AddedComponents:
|
||||||
|
- targetCorrespondingSourceObject: {fileID: 1015176535145037065, guid: 459ef74c4ee79d3eb8e1ba6a0f06c9a7, type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 2084843937911841166}
|
||||||
m_SourcePrefab: {fileID: 100100000, guid: 459ef74c4ee79d3eb8e1ba6a0f06c9a7, type: 3}
|
m_SourcePrefab: {fileID: 100100000, guid: 459ef74c4ee79d3eb8e1ba6a0f06c9a7, type: 3}
|
||||||
|
--- !u!1 &1446289441119343760 stripped
|
||||||
|
GameObject:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 1015176535145037065, guid: 459ef74c4ee79d3eb8e1ba6a0f06c9a7, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 1874870990122559897}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
--- !u!114 &2084843937911841166
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1446289441119343760}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 1d8f349ed7dc088a4a6e2690ee87094a, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::PlayerMovement
|
||||||
|
InputActions: {fileID: 0}
|
||||||
--- !u!4 &6975610370707183838 stripped
|
--- !u!4 &6975610370707183838 stripped
|
||||||
Transform:
|
Transform:
|
||||||
m_CorrespondingSourceObject: {fileID: 8848088476524540231, guid: 459ef74c4ee79d3eb8e1ba6a0f06c9a7, type: 3}
|
m_CorrespondingSourceObject: {fileID: 8848088476524540231, guid: 459ef74c4ee79d3eb8e1ba6a0f06c9a7, type: 3}
|
||||||
@@ -450,15 +570,15 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 1
|
value: 0.5
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
propertyPath: m_LocalPosition.z
|
propertyPath: m_LocalPosition.z
|
||||||
value: -3
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
propertyPath: m_LocalRotation.w
|
propertyPath: m_LocalRotation.w
|
||||||
value: 1
|
value: 0.7071068
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
propertyPath: m_LocalRotation.x
|
propertyPath: m_LocalRotation.x
|
||||||
@@ -466,7 +586,7 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
propertyPath: m_LocalRotation.y
|
propertyPath: m_LocalRotation.y
|
||||||
value: 0
|
value: 0.7071068
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
propertyPath: m_LocalRotation.z
|
propertyPath: m_LocalRotation.z
|
||||||
@@ -478,7 +598,7 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
propertyPath: m_LocalEulerAnglesHint.y
|
propertyPath: m_LocalEulerAnglesHint.y
|
||||||
value: 0
|
value: 90
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- target: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
propertyPath: m_LocalEulerAnglesHint.z
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
@@ -703,6 +823,18 @@ PrefabInstance:
|
|||||||
- targetCorrespondingSourceObject: {fileID: -927199367670048503, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
- targetCorrespondingSourceObject: {fileID: -927199367670048503, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
insertIndex: -1
|
insertIndex: -1
|
||||||
addedObject: {fileID: 3047743202467582630}
|
addedObject: {fileID: 3047743202467582630}
|
||||||
|
- targetCorrespondingSourceObject: {fileID: -927199367670048503, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 2185157095970857719}
|
||||||
|
- targetCorrespondingSourceObject: {fileID: -927199367670048503, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 2343678334924127783}
|
||||||
|
- targetCorrespondingSourceObject: {fileID: -927199367670048503, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 4313489822343726709}
|
||||||
|
- targetCorrespondingSourceObject: {fileID: -927199367670048503, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 2936940972087595065}
|
||||||
m_SourcePrefab: {fileID: 100100000, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
m_SourcePrefab: {fileID: 100100000, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
--- !u!95 &144211389547005650 stripped
|
--- !u!95 &144211389547005650 stripped
|
||||||
Animator:
|
Animator:
|
||||||
@@ -739,7 +871,7 @@ Rigidbody:
|
|||||||
m_UseGravity: 1
|
m_UseGravity: 1
|
||||||
m_IsKinematic: 0
|
m_IsKinematic: 0
|
||||||
m_Interpolate: 0
|
m_Interpolate: 0
|
||||||
m_Constraints: 80
|
m_Constraints: 112
|
||||||
m_CollisionDetection: 0
|
m_CollisionDetection: 0
|
||||||
--- !u!136 &3998354022717239476
|
--- !u!136 &3998354022717239476
|
||||||
CapsuleCollider:
|
CapsuleCollider:
|
||||||
@@ -760,10 +892,10 @@ CapsuleCollider:
|
|||||||
m_ProvidesContacts: 0
|
m_ProvidesContacts: 0
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_Radius: 0.5
|
m_Radius: 0.26813045
|
||||||
m_Height: 1.7
|
m_Height: 1.2649516
|
||||||
m_Direction: 1
|
m_Direction: 1
|
||||||
m_Center: {x: 0, y: 0.8, z: 0}
|
m_Center: {x: -0.029453307, y: 0.63073164, z: 0}
|
||||||
--- !u!65 &1215790106131549770
|
--- !u!65 &1215790106131549770
|
||||||
BoxCollider:
|
BoxCollider:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -783,8 +915,8 @@ BoxCollider:
|
|||||||
m_ProvidesContacts: 0
|
m_ProvidesContacts: 0
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_Size: {x: 0.6, y: 0.5, z: 0.6}
|
m_Size: {x: 0.6, y: 0.4560688, z: 0.3978837}
|
||||||
m_Center: {x: 0, y: 0.2, z: 0}
|
m_Center: {x: 0, y: 0.22196558, z: 0.101058155}
|
||||||
--- !u!114 &3047743202467582630
|
--- !u!114 &3047743202467582630
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -797,18 +929,71 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 1d8f349ed7dc088a4a6e2690ee87094a, type: 3}
|
m_Script: {fileID: 11500000, guid: 1d8f349ed7dc088a4a6e2690ee87094a, type: 3}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier: Assembly-CSharp::PlayerMovement
|
m_EditorClassIdentifier: Assembly-CSharp::PlayerMovement
|
||||||
InputActions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}
|
InputActions: {fileID: -944628639613478452, guid: b319948d6750538498f201a24c05aef3, type: 3}
|
||||||
|
--- !u!114 &2185157095970857719
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6544026473454475707}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 6c1ddada0161b8c4783806ef6775348a, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::PlayerLook
|
||||||
CameraTransform: {fileID: 8258725777112540271}
|
CameraTransform: {fileID: 8258725777112540271}
|
||||||
MaxLookAngle: 90
|
Head: {fileID: 8079687630579216978}
|
||||||
WalkSpeed: 5
|
|
||||||
RotateSpeed: 5
|
RotateSpeed: 5
|
||||||
|
MaxLookAngle: 90
|
||||||
|
--- !u!114 &2343678334924127783
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6544026473454475707}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 7f91586e8c2742341aa8f6925e597bf1, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::PlayerMovement
|
||||||
|
WalkSpeed: 7.5
|
||||||
|
rotationSpeed: 10
|
||||||
|
animator: {fileID: 144211389547005650}
|
||||||
|
cameraTransform: {fileID: 8258725777112540271}
|
||||||
|
--- !u!114 &4313489822343726709
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6544026473454475707}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 2da51dfecccc45b469912e3bb3f1953b, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::PlayerHeadController
|
||||||
|
Head: {fileID: 8079687630579216978}
|
||||||
|
CameraTransform: {fileID: 8258725777112540271}
|
||||||
|
ThrowForce: 10
|
||||||
|
PickupDistance: 3
|
||||||
|
isHoldingHead: 1
|
||||||
|
--- !u!114 &2936940972087595065
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6544026473454475707}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 9c524d12bc1668e42a00cbd8050107f6, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Assembly-CSharp::PlayerJump
|
||||||
JumpForce: 5
|
JumpForce: 5
|
||||||
GroundCheck: {fileID: 5774252285975285596}
|
GroundCheck: {fileID: 5774252285975285596}
|
||||||
GroundCheckRadius: 0.2
|
GroundCheckRadius: 0.2
|
||||||
animator: {fileID: 144211389547005650}
|
|
||||||
Head: {fileID: 8079687630579216978}
|
|
||||||
ThrowForce: 10
|
|
||||||
PickupDistance: 3
|
|
||||||
--- !u!4 &7821156882341915560 stripped
|
--- !u!4 &7821156882341915560 stripped
|
||||||
Transform:
|
Transform:
|
||||||
m_CorrespondingSourceObject: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
m_CorrespondingSourceObject: {fileID: -4216859302048453862, guid: 82a2914d8f86c62488456950c8330e38, type: 3}
|
||||||
|
|||||||
@@ -493,17 +493,6 @@ MonoBehaviour:
|
|||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier: Assembly-CSharp::PlayerMovement
|
m_EditorClassIdentifier: Assembly-CSharp::PlayerMovement
|
||||||
InputActions: {fileID: 0}
|
InputActions: {fileID: 0}
|
||||||
CameraTransform: {fileID: 0}
|
|
||||||
MaxLookAngle: 90
|
|
||||||
WalkSpeed: 10
|
|
||||||
RotateSpeed: 5
|
|
||||||
JumpForce: 5
|
|
||||||
GroundCheck: {fileID: 0}
|
|
||||||
GroundCheckRadius: 0.2
|
|
||||||
animator: {fileID: 0}
|
|
||||||
Head: {fileID: 0}
|
|
||||||
ThrowForce: 10
|
|
||||||
PickupDistance: 3
|
|
||||||
--- !u!114 &43211589 stripped
|
--- !u!114 &43211589 stripped
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_CorrespondingSourceObject: {fileID: 6921400718617286756, guid: 2f9e8e4a19f939f43a84c1c7d0a0e185, type: 3}
|
m_CorrespondingSourceObject: {fileID: 6921400718617286756, guid: 2f9e8e4a19f939f43a84c1c7d0a0e185, type: 3}
|
||||||
@@ -936,6 +925,9 @@ PrefabInstance:
|
|||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
m_AddedComponents:
|
m_AddedComponents:
|
||||||
|
- targetCorrespondingSourceObject: {fileID: 4446703388580953019, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 762199654}
|
||||||
- targetCorrespondingSourceObject: {fileID: 1446289441119343760, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
- targetCorrespondingSourceObject: {fileID: 1446289441119343760, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
insertIndex: -1
|
insertIndex: -1
|
||||||
addedObject: {fileID: 36927862}
|
addedObject: {fileID: 36927862}
|
||||||
@@ -37018,6 +37010,38 @@ Mesh:
|
|||||||
- serializedVersion: 1
|
- serializedVersion: 1
|
||||||
m_IndexStart: 0
|
m_IndexStart: 0
|
||||||
m_IndexCount: 0
|
m_IndexCount: 0
|
||||||
|
--- !u!1 &762199651 stripped
|
||||||
|
GameObject:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 4446703388580953019, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 99539971}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
--- !u!54 &762199654
|
||||||
|
Rigidbody:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 762199651}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Mass: 1
|
||||||
|
m_LinearDamping: 0
|
||||||
|
m_AngularDamping: 0.05
|
||||||
|
m_CenterOfMass: {x: 0, y: 0, z: 0}
|
||||||
|
m_InertiaTensor: {x: 1, y: 1, z: 1}
|
||||||
|
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ImplicitCom: 1
|
||||||
|
m_ImplicitTensor: 1
|
||||||
|
m_UseGravity: 0
|
||||||
|
m_IsKinematic: 0
|
||||||
|
m_Interpolate: 0
|
||||||
|
m_Constraints: 0
|
||||||
|
m_CollisionDetection: 0
|
||||||
--- !u!1 &818197916
|
--- !u!1 &818197916
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -37814,7 +37838,7 @@ GameObject:
|
|||||||
- component: {fileID: 1173887971}
|
- component: {fileID: 1173887971}
|
||||||
- component: {fileID: 1173887970}
|
- component: {fileID: 1173887970}
|
||||||
- component: {fileID: 1173887969}
|
- component: {fileID: 1173887969}
|
||||||
m_Layer: 0
|
m_Layer: 3
|
||||||
m_Name: Plate
|
m_Name: Plate
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
m_Icon: {fileID: 0}
|
m_Icon: {fileID: 0}
|
||||||
@@ -38238,7 +38262,7 @@ GameObject:
|
|||||||
- component: {fileID: 1225232290}
|
- component: {fileID: 1225232290}
|
||||||
- component: {fileID: 1225232289}
|
- component: {fileID: 1225232289}
|
||||||
- component: {fileID: 1225232288}
|
- component: {fileID: 1225232288}
|
||||||
m_Layer: 0
|
m_Layer: 3
|
||||||
m_Name: Floor
|
m_Name: Floor
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
m_Icon: {fileID: 0}
|
m_Icon: {fileID: 0}
|
||||||
@@ -72873,7 +72897,7 @@ MeshCollider:
|
|||||||
serializedVersion: 5
|
serializedVersion: 5
|
||||||
m_Convex: 0
|
m_Convex: 0
|
||||||
m_CookingOptions: 30
|
m_CookingOptions: 30
|
||||||
m_Mesh: {fileID: 163208307}
|
m_Mesh: {fileID: 1925451917}
|
||||||
--- !u!33 &1434828806
|
--- !u!33 &1434828806
|
||||||
MeshFilter:
|
MeshFilter:
|
||||||
m_ObjectHideFlags: 10
|
m_ObjectHideFlags: 10
|
||||||
@@ -107201,7 +107225,7 @@ GameObject:
|
|||||||
- component: {fileID: 1524676968}
|
- component: {fileID: 1524676968}
|
||||||
- component: {fileID: 1524676967}
|
- component: {fileID: 1524676967}
|
||||||
- component: {fileID: 1524676966}
|
- component: {fileID: 1524676966}
|
||||||
m_Layer: 0
|
m_Layer: 3
|
||||||
m_Name: Plate
|
m_Name: Plate
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
m_Icon: {fileID: 0}
|
m_Icon: {fileID: 0}
|
||||||
@@ -109741,7 +109765,7 @@ MeshCollider:
|
|||||||
serializedVersion: 5
|
serializedVersion: 5
|
||||||
m_Convex: 0
|
m_Convex: 0
|
||||||
m_CookingOptions: 30
|
m_CookingOptions: 30
|
||||||
m_Mesh: {fileID: 1076043271}
|
m_Mesh: {fileID: 163208307}
|
||||||
--- !u!33 &2017727403
|
--- !u!33 &2017727403
|
||||||
MeshFilter:
|
MeshFilter:
|
||||||
m_ObjectHideFlags: 10
|
m_ObjectHideFlags: 10
|
||||||
|
|||||||
@@ -246,6 +246,11 @@ MonoBehaviour:
|
|||||||
m_ShadowLayerMask: 1
|
m_ShadowLayerMask: 1
|
||||||
m_RenderingLayers: 1
|
m_RenderingLayers: 1
|
||||||
m_ShadowRenderingLayers: 1
|
m_ShadowRenderingLayers: 1
|
||||||
|
--- !u!4 &573532104 stripped
|
||||||
|
Transform:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 8258725777112540271, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 762024470}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
--- !u!1001 &762024470
|
--- !u!1001 &762024470
|
||||||
PrefabInstance:
|
PrefabInstance:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -254,10 +259,38 @@ PrefabInstance:
|
|||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TransformParent: {fileID: 0}
|
m_TransformParent: {fileID: 0}
|
||||||
m_Modifications:
|
m_Modifications:
|
||||||
- target: {fileID: 3047743202467582630, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
- target: {fileID: 2343678334924127783, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
propertyPath: InputActions
|
propertyPath: animator
|
||||||
value:
|
value:
|
||||||
objectReference: {fileID: -944628639613478452, guid: b319948d6750538498f201a24c05aef3, type: 3}
|
objectReference: {fileID: 2044346512}
|
||||||
|
- target: {fileID: 2343678334924127783, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: cameraTransform
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 573532104}
|
||||||
|
- target: {fileID: 3702287221525863218, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Constraints
|
||||||
|
value: 112
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4313489822343726709, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: isHoldingHead
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6096268390463610501, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Size.y
|
||||||
|
value: 0.5844476
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6096268390463610501, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Size.z
|
||||||
|
value: 0.75984764
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6096268390463610501, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Center.y
|
||||||
|
value: 1.2922238
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6096268390463610501, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Center.z
|
||||||
|
value: 0.060781002
|
||||||
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6544026473454475707, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
- target: {fileID: 6544026473454475707, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: Player
|
value: Player
|
||||||
@@ -302,8 +335,13 @@ PrefabInstance:
|
|||||||
propertyPath: m_LocalEulerAnglesHint.z
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8258725777112540271, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0.3157
|
||||||
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects:
|
||||||
|
- {fileID: 472912051752212496, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
m_AddedComponents: []
|
m_AddedComponents: []
|
||||||
m_SourcePrefab: {fileID: 100100000, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
m_SourcePrefab: {fileID: 100100000, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
@@ -575,12 +613,17 @@ Transform:
|
|||||||
m_GameObject: {fileID: 1430443543}
|
m_GameObject: {fileID: 1430443543}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
m_LocalPosition: {x: 0.3763, y: 3.05, z: 10}
|
m_LocalPosition: {x: 0.3763, y: 0, z: 4.34}
|
||||||
m_LocalScale: {x: 12.810944, y: 5.8166175, z: 1}
|
m_LocalScale: {x: 12.810944, y: 5.8166175, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!95 &2044346512 stripped
|
||||||
|
Animator:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 144211389547005650, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 762024470}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
--- !u!1660057539 &9223372036854775807
|
--- !u!1660057539 &9223372036854775807
|
||||||
SceneRoots:
|
SceneRoots:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: f7ddf8204ae4327bb84e928c9ae561d4
|
guid: f9ccf03e1da5f4a4683903447659b3d7
|
||||||
NativeFormatImporter:
|
NativeFormatImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
mainObjectFileID: 13400000
|
mainObjectFileID: 13400000
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!134 &13400000
|
||||||
|
PhysicsMaterial:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: No_Friction
|
||||||
|
serializedVersion: 2
|
||||||
|
m_DynamicFriction: 0
|
||||||
|
m_StaticFriction: 0
|
||||||
|
m_Bounciness: 0
|
||||||
|
m_FrictionCombine: 0
|
||||||
|
m_BounceCombine: 0
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f7ddf8204ae4327bb84e928c9ae561d4
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 13400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/_Recovery.meta
Normal file
8
Assets/_Recovery.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: eac7d60bc6ab8b4418e2bd8ff27ded01
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
713
Assets/_Recovery/0.unity
Normal file
713
Assets/_Recovery/0.unity
Normal file
@@ -0,0 +1,713 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!29 &1
|
||||||
|
OcclusionCullingSettings:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 2
|
||||||
|
m_OcclusionBakeSettings:
|
||||||
|
smallestOccluder: 5
|
||||||
|
smallestHole: 0.25
|
||||||
|
backfaceThreshold: 100
|
||||||
|
m_SceneGUID: 00000000000000000000000000000000
|
||||||
|
m_OcclusionCullingData: {fileID: 0}
|
||||||
|
--- !u!104 &2
|
||||||
|
RenderSettings:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 10
|
||||||
|
m_Fog: 0
|
||||||
|
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||||
|
m_FogMode: 3
|
||||||
|
m_FogDensity: 0.01
|
||||||
|
m_LinearFogStart: 0
|
||||||
|
m_LinearFogEnd: 300
|
||||||
|
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
|
||||||
|
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
|
||||||
|
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
|
||||||
|
m_AmbientIntensity: 1
|
||||||
|
m_AmbientMode: 0
|
||||||
|
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||||
|
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_HaloStrength: 0.5
|
||||||
|
m_FlareStrength: 1
|
||||||
|
m_FlareFadeSpeed: 3
|
||||||
|
m_HaloTexture: {fileID: 0}
|
||||||
|
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
m_DefaultReflectionMode: 0
|
||||||
|
m_DefaultReflectionResolution: 128
|
||||||
|
m_ReflectionBounces: 1
|
||||||
|
m_ReflectionIntensity: 1
|
||||||
|
m_CustomReflection: {fileID: 0}
|
||||||
|
m_Sun: {fileID: 0}
|
||||||
|
m_UseRadianceAmbientProbe: 0
|
||||||
|
--- !u!157 &3
|
||||||
|
LightmapSettings:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 13
|
||||||
|
m_BakeOnSceneLoad: 0
|
||||||
|
m_GISettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_BounceScale: 1
|
||||||
|
m_IndirectOutputScale: 1
|
||||||
|
m_AlbedoBoost: 1
|
||||||
|
m_EnvironmentLightingMode: 0
|
||||||
|
m_EnableBakedLightmaps: 1
|
||||||
|
m_EnableRealtimeLightmaps: 0
|
||||||
|
m_LightmapEditorSettings:
|
||||||
|
serializedVersion: 12
|
||||||
|
m_Resolution: 2
|
||||||
|
m_BakeResolution: 40
|
||||||
|
m_AtlasSize: 1024
|
||||||
|
m_AO: 0
|
||||||
|
m_AOMaxDistance: 1
|
||||||
|
m_CompAOExponent: 1
|
||||||
|
m_CompAOExponentDirect: 0
|
||||||
|
m_ExtractAmbientOcclusion: 0
|
||||||
|
m_Padding: 2
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_LightmapsBakeMode: 1
|
||||||
|
m_TextureCompression: 1
|
||||||
|
m_ReflectionCompression: 2
|
||||||
|
m_MixedBakeMode: 2
|
||||||
|
m_BakeBackend: 1
|
||||||
|
m_PVRSampling: 1
|
||||||
|
m_PVRDirectSampleCount: 32
|
||||||
|
m_PVRSampleCount: 512
|
||||||
|
m_PVRBounces: 2
|
||||||
|
m_PVREnvironmentSampleCount: 256
|
||||||
|
m_PVREnvironmentReferencePointCount: 2048
|
||||||
|
m_PVRFilteringMode: 1
|
||||||
|
m_PVRDenoiserTypeDirect: 1
|
||||||
|
m_PVRDenoiserTypeIndirect: 1
|
||||||
|
m_PVRDenoiserTypeAO: 1
|
||||||
|
m_PVRFilterTypeDirect: 0
|
||||||
|
m_PVRFilterTypeIndirect: 0
|
||||||
|
m_PVRFilterTypeAO: 0
|
||||||
|
m_PVREnvironmentMIS: 1
|
||||||
|
m_PVRCulling: 1
|
||||||
|
m_PVRFilteringGaussRadiusDirect: 1
|
||||||
|
m_PVRFilteringGaussRadiusIndirect: 5
|
||||||
|
m_PVRFilteringGaussRadiusAO: 2
|
||||||
|
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||||
|
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||||
|
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||||
|
m_ExportTrainingData: 0
|
||||||
|
m_TrainingDataDestination: TrainingData
|
||||||
|
m_LightProbeSampleCountMultiplier: 4
|
||||||
|
m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_LightingSettings: {fileID: 0}
|
||||||
|
--- !u!196 &4
|
||||||
|
NavMeshSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_BuildSettings:
|
||||||
|
serializedVersion: 3
|
||||||
|
agentTypeID: 0
|
||||||
|
agentRadius: 0.5
|
||||||
|
agentHeight: 2
|
||||||
|
agentSlope: 45
|
||||||
|
agentClimb: 0.4
|
||||||
|
ledgeDropHeight: 0
|
||||||
|
maxJumpAcrossDistance: 0
|
||||||
|
minRegionArea: 2
|
||||||
|
manualCellSize: 0
|
||||||
|
cellSize: 0.16666667
|
||||||
|
manualTileSize: 0
|
||||||
|
tileSize: 256
|
||||||
|
buildHeightMesh: 0
|
||||||
|
maxJobWorkers: 0
|
||||||
|
preserveTilesOutsideBounds: 0
|
||||||
|
debug:
|
||||||
|
m_Flags: 0
|
||||||
|
m_NavMeshData: {fileID: 0}
|
||||||
|
--- !u!1 &94026883
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 94026887}
|
||||||
|
- component: {fileID: 94026886}
|
||||||
|
- component: {fileID: 94026885}
|
||||||
|
- component: {fileID: 94026884}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Cube (1)
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!65 &94026884
|
||||||
|
BoxCollider:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 94026883}
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_LayerOverridePriority: 0
|
||||||
|
m_IsTrigger: 0
|
||||||
|
m_ProvidesContacts: 0
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_Size: {x: 1, y: 1, z: 1}
|
||||||
|
m_Center: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!23 &94026885
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 94026883}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 1
|
||||||
|
m_ReceiveShadows: 1
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RayTracingMode: 2
|
||||||
|
m_RayTraceProcedural: 0
|
||||||
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
|
m_RenderingLayerMask: 1
|
||||||
|
m_RendererPriority: 0
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_ReceiveGI: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 1
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_MaskInteraction: 0
|
||||||
|
m_AdditionalVertexStreams: {fileID: 0}
|
||||||
|
--- !u!33 &94026886
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 94026883}
|
||||||
|
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
--- !u!4 &94026887
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 94026883}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0.3763, y: -2.27, z: -0.22}
|
||||||
|
m_LocalScale: {x: 1.2236117, y: 5.8166175, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1 &410087039
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 410087041}
|
||||||
|
- component: {fileID: 410087040}
|
||||||
|
- component: {fileID: 410087042}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Directional Light
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!108 &410087040
|
||||||
|
Light:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 410087039}
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 12
|
||||||
|
m_Type: 1
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_Intensity: 2
|
||||||
|
m_Range: 10
|
||||||
|
m_SpotAngle: 30
|
||||||
|
m_InnerSpotAngle: 21.80208
|
||||||
|
m_CookieSize2D: {x: 10, y: 10}
|
||||||
|
m_Shadows:
|
||||||
|
m_Type: 2
|
||||||
|
m_Resolution: -1
|
||||||
|
m_CustomResolution: -1
|
||||||
|
m_Strength: 1
|
||||||
|
m_Bias: 0.05
|
||||||
|
m_NormalBias: 0.4
|
||||||
|
m_NearPlane: 0.2
|
||||||
|
m_CullingMatrixOverride:
|
||||||
|
e00: 1
|
||||||
|
e01: 0
|
||||||
|
e02: 0
|
||||||
|
e03: 0
|
||||||
|
e10: 0
|
||||||
|
e11: 1
|
||||||
|
e12: 0
|
||||||
|
e13: 0
|
||||||
|
e20: 0
|
||||||
|
e21: 0
|
||||||
|
e22: 1
|
||||||
|
e23: 0
|
||||||
|
e30: 0
|
||||||
|
e31: 0
|
||||||
|
e32: 0
|
||||||
|
e33: 1
|
||||||
|
m_UseCullingMatrixOverride: 0
|
||||||
|
m_Cookie: {fileID: 0}
|
||||||
|
m_DrawHalo: 0
|
||||||
|
m_Flare: {fileID: 0}
|
||||||
|
m_RenderMode: 0
|
||||||
|
m_CullingMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 4294967295
|
||||||
|
m_RenderingLayerMask: 1
|
||||||
|
m_Lightmapping: 4
|
||||||
|
m_LightShadowCasterMode: 0
|
||||||
|
m_AreaSize: {x: 1, y: 1}
|
||||||
|
m_BounceIntensity: 1
|
||||||
|
m_ColorTemperature: 5000
|
||||||
|
m_UseColorTemperature: 1
|
||||||
|
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_UseBoundingSphereOverride: 0
|
||||||
|
m_UseViewFrustumForShadowCasterCull: 1
|
||||||
|
m_ForceVisible: 0
|
||||||
|
m_ShadowRadius: 0
|
||||||
|
m_ShadowAngle: 0
|
||||||
|
m_LightUnit: 1
|
||||||
|
m_LuxAtDistance: 1
|
||||||
|
m_EnableSpotReflector: 1
|
||||||
|
--- !u!4 &410087041
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 410087039}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
|
||||||
|
m_LocalPosition: {x: 0, y: 3, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
|
||||||
|
--- !u!114 &410087042
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 410087039}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_UsePipelineSettings: 1
|
||||||
|
m_AdditionalLightsShadowResolutionTier: 2
|
||||||
|
m_CustomShadowLayers: 0
|
||||||
|
m_LightCookieSize: {x: 1, y: 1}
|
||||||
|
m_LightCookieOffset: {x: 0, y: 0}
|
||||||
|
m_SoftShadowQuality: 1
|
||||||
|
m_RenderingLayersMask:
|
||||||
|
serializedVersion: 0
|
||||||
|
m_Bits: 1
|
||||||
|
m_ShadowRenderingLayersMask:
|
||||||
|
serializedVersion: 0
|
||||||
|
m_Bits: 1
|
||||||
|
m_Version: 4
|
||||||
|
m_LightLayerMask: 1
|
||||||
|
m_ShadowLayerMask: 1
|
||||||
|
m_RenderingLayers: 1
|
||||||
|
m_ShadowRenderingLayers: 1
|
||||||
|
--- !u!1001 &762024470
|
||||||
|
PrefabInstance:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TransformParent: {fileID: 0}
|
||||||
|
m_Modifications:
|
||||||
|
- target: {fileID: 1215790106131549770, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Size.z
|
||||||
|
value: 0.3978837
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 1215790106131549770, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Enabled
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 1215790106131549770, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Center.z
|
||||||
|
value: 0.101058155
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6544026473454475707, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_Name
|
||||||
|
value: Player
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 1.48
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: -6.57
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.w
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
m_RemovedComponents: []
|
||||||
|
m_RemovedGameObjects: []
|
||||||
|
m_AddedGameObjects: []
|
||||||
|
m_AddedComponents: []
|
||||||
|
m_SourcePrefab: {fileID: 100100000, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3}
|
||||||
|
--- !u!1 &832575517
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 832575519}
|
||||||
|
- component: {fileID: 832575518}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Global Volume
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &832575518
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 832575517}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_IsGlobal: 1
|
||||||
|
priority: 0
|
||||||
|
blendDistance: 0
|
||||||
|
weight: 1
|
||||||
|
sharedProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2}
|
||||||
|
--- !u!4 &832575519
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 832575517}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1 &1118537122
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1118537126}
|
||||||
|
- component: {fileID: 1118537125}
|
||||||
|
- component: {fileID: 1118537124}
|
||||||
|
- component: {fileID: 1118537123}
|
||||||
|
m_Layer: 3
|
||||||
|
m_Name: Plane
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!64 &1118537123
|
||||||
|
MeshCollider:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1118537122}
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_LayerOverridePriority: 0
|
||||||
|
m_IsTrigger: 0
|
||||||
|
m_ProvidesContacts: 0
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Convex: 0
|
||||||
|
m_CookingOptions: 30
|
||||||
|
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
--- !u!23 &1118537124
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1118537122}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 1
|
||||||
|
m_ReceiveShadows: 1
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RayTracingMode: 2
|
||||||
|
m_RayTraceProcedural: 0
|
||||||
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
|
m_RenderingLayerMask: 1
|
||||||
|
m_RendererPriority: 0
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_ReceiveGI: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 1
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_MaskInteraction: 0
|
||||||
|
m_AdditionalVertexStreams: {fileID: 0}
|
||||||
|
--- !u!33 &1118537125
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1118537122}
|
||||||
|
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
--- !u!4 &1118537126
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1118537122}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 15, y: 1, z: 15}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1 &1430443543
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1430443547}
|
||||||
|
- component: {fileID: 1430443546}
|
||||||
|
- component: {fileID: 1430443545}
|
||||||
|
- component: {fileID: 1430443544}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Cube
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!65 &1430443544
|
||||||
|
BoxCollider:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1430443543}
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_LayerOverridePriority: 0
|
||||||
|
m_IsTrigger: 0
|
||||||
|
m_ProvidesContacts: 0
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_Size: {x: 1, y: 1, z: 1}
|
||||||
|
m_Center: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!23 &1430443545
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1430443543}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 1
|
||||||
|
m_ReceiveShadows: 1
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RayTracingMode: 2
|
||||||
|
m_RayTraceProcedural: 0
|
||||||
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
|
m_RenderingLayerMask: 1
|
||||||
|
m_RendererPriority: 0
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_ReceiveGI: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 1
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_MaskInteraction: 0
|
||||||
|
m_AdditionalVertexStreams: {fileID: 0}
|
||||||
|
--- !u!33 &1430443546
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1430443543}
|
||||||
|
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
--- !u!4 &1430443547
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1430443543}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0.3763, y: 0, z: 4.34}
|
||||||
|
m_LocalScale: {x: 12.810944, y: 5.8166175, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1660057539 &9223372036854775807
|
||||||
|
SceneRoots:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_Roots:
|
||||||
|
- {fileID: 410087041}
|
||||||
|
- {fileID: 832575519}
|
||||||
|
- {fileID: 762024470}
|
||||||
|
- {fileID: 1430443547}
|
||||||
|
- {fileID: 94026887}
|
||||||
|
- {fileID: 1118537126}
|
||||||
7
Assets/_Recovery/0.unity.meta
Normal file
7
Assets/_Recovery/0.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5954e88297a9d80418e76e95e2864a5f
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
304
Packages/com.merry-yellow.code-assist/CHANGELOG.md
Normal file
304
Packages/com.merry-yellow.code-assist/CHANGELOG.md
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
List of new features, bug fixes and improvements
|
||||||
|
|
||||||
|
# Version 1.4.19
|
||||||
|
* AGENTS.md support for agentic AI, copilot-instructions.md support is deprecated
|
||||||
|
* Visual Studio 2026 compatibility
|
||||||
|
* Bugfix for completions and inline visuals for sorting layer related members
|
||||||
|
* Can unspecify max_tokens,temperature and top_p in the gpt request options
|
||||||
|
* Gpt libraries and models are updated
|
||||||
|
|
||||||
|
# Version 1.4.18
|
||||||
|
* New code completions: Material/Shader
|
||||||
|
* New inline visuals: Material/Shader
|
||||||
|
* Bugfix for inline text visuals when document is edited
|
||||||
|
* Bugfix for completions for constructor method arguments
|
||||||
|
* Hotfix for InputManager data fetching with custom tags
|
||||||
|
* Gpt models are updated
|
||||||
|
|
||||||
|
# Version 1.4.17
|
||||||
|
* Hotfix for Unity compile error
|
||||||
|
|
||||||
|
# Version 1.4.16
|
||||||
|
* New code completions: RenderingLayerMask (Unity 6 and newer only)
|
||||||
|
* New inline visuals: RenderingLayerMask (Unity 6 and newer only), and LayerMask
|
||||||
|
* Hotfix for Unity editor freezes
|
||||||
|
* Hotfix for inline visuals not showing properly when changing document in Visual Studio
|
||||||
|
* Category SortingLayer removed, its items are now under category Layer
|
||||||
|
* Minor fix for output window in Visual Studio
|
||||||
|
* Gpt libraries and models are updated
|
||||||
|
|
||||||
|
# Version 1.4.15
|
||||||
|
* Hotfix for code completion for attributes
|
||||||
|
|
||||||
|
# Version 1.4.14
|
||||||
|
* New code completions: Attributes and preprocessor directives (#if, #elif)
|
||||||
|
* New gpt feature: Add mode, gpt can add new files to the project
|
||||||
|
* New gpt feature: For CodeLens, follow-up question and custom prompt
|
||||||
|
* Gpt responses are logged to Visual Studio output window
|
||||||
|
|
||||||
|
# Version 1.4.13
|
||||||
|
* Hotfix for gpt requests of OpenAI-API-Compatible platforms
|
||||||
|
|
||||||
|
# Version 1.4.12
|
||||||
|
* Additional properties options added for gpt requests
|
||||||
|
* Version number mistype fix for Unity asset package
|
||||||
|
|
||||||
|
# Version 1.4.11
|
||||||
|
* Hotfix for gpt options page
|
||||||
|
* Fix for applying transformers for newer versions of Visual Studio
|
||||||
|
* Arm64 architecture support
|
||||||
|
|
||||||
|
# Version 1.4.10
|
||||||
|
* Animations added to context aware instructions
|
||||||
|
* Hotfix for context aware integrations (for GitHub Copilot)
|
||||||
|
|
||||||
|
# Version 1.4.9
|
||||||
|
* Hotfix for gpt options page
|
||||||
|
|
||||||
|
# Version 1.4.8
|
||||||
|
* Version bump for sister Visual Studio extensions
|
||||||
|
|
||||||
|
# Version 1.4.7
|
||||||
|
* New gpt feature: Integration into GitHub Copilot. Can now feed GitHub Copilot with project/scene/game-object details.
|
||||||
|
* Auto updater for itch.io builds
|
||||||
|
|
||||||
|
# Version 1.4.6
|
||||||
|
* Updated binaries with new build parameters
|
||||||
|
|
||||||
|
# Version 1.4.5
|
||||||
|
* Version skipped by mistake ^-^
|
||||||
|
|
||||||
|
# Version 1.4.4
|
||||||
|
* Hotfix for Unity package compile error
|
||||||
|
|
||||||
|
# Version 1.4.3
|
||||||
|
* New gpt provider: OpenAI API Compatible, for web/cloud services that supports OpenAI SDK standards
|
||||||
|
|
||||||
|
# Version 1.4.2
|
||||||
|
* Bugfix for formatting and title of logging
|
||||||
|
* Bugfix for CodeLens2Gpt when closing document
|
||||||
|
|
||||||
|
# Version 1.4.1
|
||||||
|
* New gpt provider: Ollama, can use LLMs from local machine or private network
|
||||||
|
|
||||||
|
# Version 1.4.0
|
||||||
|
* Gpt backend has been reimplemented for latest models and LLM trends
|
||||||
|
* New gpt provider: Anthropic (Claude), can be used as an alternative to OpenAI ChatGPT and Google Gemini
|
||||||
|
* New gpt provider: DeepSeek, can be used as an alternative to OpenAI ChatGPT and Google Gemini
|
||||||
|
* New code completions: Scene management classes can be auto completed
|
||||||
|
* New inline visuals: Scene management classes can display inline information
|
||||||
|
|
||||||
|
# Version 1.3.12
|
||||||
|
* Hotfix for Microsoft Marketplace manifest file
|
||||||
|
|
||||||
|
# Version 1.3.11
|
||||||
|
* Hotfix for Microsoft Marketplace manifest file
|
||||||
|
|
||||||
|
# Version 1.3.10
|
||||||
|
* Hotfix for type resolving
|
||||||
|
* Usability improvements for VSCode exporter
|
||||||
|
* More filters for expected error logs
|
||||||
|
|
||||||
|
# Version 1.3.9
|
||||||
|
* Hotfix for Unity sink
|
||||||
|
|
||||||
|
# Version 1.3.8
|
||||||
|
* Hotfix for Unity sink
|
||||||
|
|
||||||
|
# Version 1.3.7
|
||||||
|
* Bugfix for exporter/updater
|
||||||
|
* Bugfix for logging options
|
||||||
|
|
||||||
|
# Version 1.3.6
|
||||||
|
* VSCode readme updated
|
||||||
|
|
||||||
|
# Version 1.3.5
|
||||||
|
* JSON library switched back to Newtonsoft.JSON
|
||||||
|
* Rule xml files removed from Unity asset
|
||||||
|
* Unnessary analyzer binaries are removed from Roslyn Analyzer
|
||||||
|
|
||||||
|
# Version 1.3.4
|
||||||
|
* Stability improvements for network (mqttnet)
|
||||||
|
* Hotfix for JSON mapping
|
||||||
|
|
||||||
|
# Version 1.3.3
|
||||||
|
* Full version for VSCode is released!
|
||||||
|
* Fix for VSCode adorments when document is modified
|
||||||
|
* Binary files removed from Unity asset
|
||||||
|
* Bugfix for network (mqttnet server)
|
||||||
|
* VSCode extension stability improvements
|
||||||
|
* VSCode roslyn analyzer stability improvements
|
||||||
|
|
||||||
|
# Version 1.3.2
|
||||||
|
* Fixed cross-platform issues for Linux and macOS
|
||||||
|
|
||||||
|
# Version 1.3.1
|
||||||
|
* Updated VSCode manifest and readme
|
||||||
|
|
||||||
|
# Version 1.3.0
|
||||||
|
* Initial release for VSCode
|
||||||
|
|
||||||
|
# Version 1.2.6
|
||||||
|
* Exporting when Unity is in play mode
|
||||||
|
* Some error messages have been made more user friendly
|
||||||
|
|
||||||
|
# Version 1.2.5
|
||||||
|
* Released on itch.io https://meryel.itch.io/unity-code-assist
|
||||||
|
* Url changes
|
||||||
|
|
||||||
|
# Version 1.2.4
|
||||||
|
* Bugfix for exporter with long file paths
|
||||||
|
* Bugfix for retrieving animation and animator data
|
||||||
|
|
||||||
|
# Version 1.2.3
|
||||||
|
* Bugfix for exporter when overwriting files
|
||||||
|
* Bugfix for inline visuals when active game object changes
|
||||||
|
|
||||||
|
# Version 1.2.2
|
||||||
|
* Bugfix for exporter when facing race condition
|
||||||
|
|
||||||
|
# Version 1.2.1
|
||||||
|
* Typo fix for Options page
|
||||||
|
* Bugfix for retrieving animation and animator data
|
||||||
|
|
||||||
|
# Version 1.2.0
|
||||||
|
* New gpt provider: Google Gemini, can be used as an alternative to OpenAI ChatGPT
|
||||||
|
* New feature: CodeLens2Gpt. Can request gpt queries from the CodeLens of methods and classes
|
||||||
|
* New feature: Context aware gpt, gpt prompts are embedded with Unity, scene and object information
|
||||||
|
* New feature: Package, asset has relocated under Packages directory (from Assets directýry), along with Unity setup menu items
|
||||||
|
* New code completions: Animation and Animator classes and Invoke/Coroutine/Broadcast methods can be auto completed
|
||||||
|
* New inline visuals: Animation and Animator classes can display inline information
|
||||||
|
|
||||||
|
# Version 1.1.12
|
||||||
|
* External binary files have been customized and minimized
|
||||||
|
* Domain reloading time have been reduced
|
||||||
|
* Stability and usability improvements for exporter/updater
|
||||||
|
* Bugfix for Feedback window
|
||||||
|
|
||||||
|
# Version 1.1.11
|
||||||
|
* Gpt completion endpoint fixed for OpenAI API changes
|
||||||
|
* Bugfix for Input Manager monitor
|
||||||
|
* Bugfix for logging to Visual Studio output window
|
||||||
|
* Bugfix for About window
|
||||||
|
|
||||||
|
# Version 1.1.10
|
||||||
|
* Version skipped for compatibility with other assets
|
||||||
|
|
||||||
|
# Version 1.1.9
|
||||||
|
* Gpt support for chat and edit
|
||||||
|
* More options added for Gpt
|
||||||
|
* Overall stability improvements
|
||||||
|
* Exporter shows file locks if update/export is unsuccessful
|
||||||
|
|
||||||
|
# Version 1.1.8
|
||||||
|
* Bugfix for non-Unity solutions
|
||||||
|
|
||||||
|
# Version 1.1.7
|
||||||
|
* Bugfix for Visual Studio freeze
|
||||||
|
|
||||||
|
# Version 1.1.6
|
||||||
|
* Gpt support added for shader files
|
||||||
|
* Stability improvements for Unity.ScriptFinder
|
||||||
|
|
||||||
|
# Version 1.1.5
|
||||||
|
* Stability and usability improvements for exporter/updater
|
||||||
|
* Bugfix for Transformer Linq and Auto Input Manager
|
||||||
|
* Usability for Transformer window, disabling it if not connected to Unity
|
||||||
|
* Enhancement for completions, sorting numerical values correctly https://github.com/merryyellow/Unity-Code-Assist/issues/6
|
||||||
|
|
||||||
|
# Version 1.1.4
|
||||||
|
* Auto Input Manager is now compatible with binary asset files
|
||||||
|
* Stability and usability improvements for Transformer windows
|
||||||
|
|
||||||
|
# Version 1.1.3
|
||||||
|
* Analyzers are working at a separate process https://github.com/merryyellow/Unity-Code-Assist/issues/20
|
||||||
|
* Inline visuals stability and performance improvements https://github.com/merryyellow/Unity-Code-Assist/issues/22 https://github.com/merryyellow/Unity-Code-Assist/issues/24
|
||||||
|
* Exporter/updater stability improvements https://github.com/merryyellow/Unity-Code-Assist/issues/19 https://github.com/merryyellow/Unity-Code-Assist/issues/23
|
||||||
|
* Transformer window stability improvements https://github.com/merryyellow/Unity-Code-Assist/issues/21
|
||||||
|
* Bugfix for Gpt busy icon positioning https://github.com/merryyellow/Unity-Code-Assist/issues/24
|
||||||
|
|
||||||
|
# Version 1.1.2
|
||||||
|
* Bugfix for Yaml file parsing of InputManager
|
||||||
|
|
||||||
|
# Version 1.1.1
|
||||||
|
* Bugfix for error handling of binary file parsing
|
||||||
|
|
||||||
|
# Version 1.1.0
|
||||||
|
* New feature: Generative AI. Use OpenAI ChatGPT within comments to complete your code
|
||||||
|
* New feature: Visual Studio menus. Access Unity Code Assist from "Extensions"->"Unity Code Assist"
|
||||||
|
* New code completions: PlayerPrefs, EditorPrefs and Input classes' methods can be auto completed
|
||||||
|
* New inline visuals: PlayerPrefs, EditorPrefs and Input classes' methods can display inline information
|
||||||
|
* New code transformer: Auto Input Manager. Converts legacy input code into the new Input Manager
|
||||||
|
|
||||||
|
# Version 1.0.0.21
|
||||||
|
* Stability improvements for Unity ScriptFinder class
|
||||||
|
|
||||||
|
# Version 1.0.0.20
|
||||||
|
* Bugfix for crash at startup https://github.com/merryyellow/Unity-Code-Assist/issues/18
|
||||||
|
|
||||||
|
# Version 1.0.0.19
|
||||||
|
* More logging for error tracking
|
||||||
|
|
||||||
|
# Version 1.0.0.18
|
||||||
|
* Overall stability improvements, nullable references enabled for codebase
|
||||||
|
* Stability improvements for communications, when reconnection occurs
|
||||||
|
|
||||||
|
# Version 1.0.0.17
|
||||||
|
* Stability improvements for Unity ScriptFinder class
|
||||||
|
|
||||||
|
# Version 1.0.0.16
|
||||||
|
* Bugfix for Visual Studio events concurrency
|
||||||
|
|
||||||
|
# Version 1.0.0.15
|
||||||
|
* Visual Studio events are reimplemented for both stability and performance
|
||||||
|
* Removal of possible Task deadlocks
|
||||||
|
* Usability improvements for exporter/updater
|
||||||
|
* Bugfix for exporter/updater, where prompts can appear twice
|
||||||
|
* Bugfix for Inline Texts, where const null identifier may raise exceptions https://github.com/merryyellow/Unity-Code-Assist/issues/16
|
||||||
|
* Bugfix for communications, where tags&layers are sent for the first time
|
||||||
|
|
||||||
|
# Version 1.0.0.14
|
||||||
|
* Usability improvements for Visual Studio Status window where project is not a Unity project
|
||||||
|
* Bugfix for communication reinitialization, where projects are closed and opened from Visual Studio https://github.com/merryyellow/Unity-Code-Assist/issues/15
|
||||||
|
* Bugfix for Visual Studio events' initialization https://github.com/merryyellow/Unity-Code-Assist/issues/14
|
||||||
|
|
||||||
|
# Version 1.0.0.13
|
||||||
|
* Bugfix for Unity where target object is neither Component nor MonoBehaviour https://github.com/merryyellow/Unity-Code-Assist/issues/13
|
||||||
|
|
||||||
|
# Version 1.0.0.12
|
||||||
|
* New Feature: Updating Unity asset from Visual Studio
|
||||||
|
* New Feature: Online error reporting of Unity errors
|
||||||
|
* Usability improvement for Visual Studio Feedback window
|
||||||
|
* Bugfix for Inline Texts where there is no class declaration https://github.com/merryyellow/Unity-Code-Assist/issues/5
|
||||||
|
* Bugfix for Code Completion where there is no class declaration https://github.com/merryyellow/Unity-Code-Assist/issues/10
|
||||||
|
* Bugfix for Visual Studio output window, where it may be unavailable
|
||||||
|
|
||||||
|
# Version 1.0.0.11
|
||||||
|
* Bugfix for Visual Studio events' initialization https://github.com/merryyellow/Unity-Code-Assist/issues/3
|
||||||
|
* Exporter now has more logs
|
||||||
|
|
||||||
|
# Version 1.0.0.10
|
||||||
|
* Bugfix for Inline Texts where leading trivia is absent https://github.com/merryyellow/Unity-Code-Assist/issues/1
|
||||||
|
* Bugfix for Visual Studio events' initialization https://github.com/merryyellow/Unity-Code-Assist/issues/2
|
||||||
|
|
||||||
|
# Version 1.0.0.9
|
||||||
|
* Minor adjustments for initialization logging
|
||||||
|
|
||||||
|
# Version 1.0.0.8
|
||||||
|
* Online analytics added
|
||||||
|
* Bugfix for Inline Texts, Visual Studio code preview screen does not raise any exception anymore
|
||||||
|
|
||||||
|
# Version 1.0.0.7
|
||||||
|
* Online error tracker added
|
||||||
|
|
||||||
|
# Version 1.0.0.6
|
||||||
|
* Exporter is always disabled for non Unity projects
|
||||||
|
|
||||||
|
# Version 1.0.0.5
|
||||||
|
* Lite version released at Visual Studio Marketplace
|
||||||
|
* Exporting Unity asset from Visual Studio
|
||||||
|
* Unity package become package independent (Removed Newtonsoft.Json dependency)
|
||||||
|
|
||||||
|
# Version 1.0.0
|
||||||
|
* First release!
|
||||||
|
* Released on Unity Asset Store
|
||||||
7
Packages/com.merry-yellow.code-assist/CHANGELOG.md.meta
Normal file
7
Packages/com.merry-yellow.code-assist/CHANGELOG.md.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1c541f26362738d45ad369a0458b7559
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Packages/com.merry-yellow.code-assist/Editor.meta
Normal file
8
Packages/com.merry-yellow.code-assist/Editor.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1c4f29bc8d89b284cb9b38090b87a507
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
75
Packages/com.merry-yellow.code-assist/Editor/AboutWindow.cs
Normal file
75
Packages/com.merry-yellow.code-assist/Editor/AboutWindow.cs
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
public class AboutWindow : EditorWindow
|
||||||
|
{
|
||||||
|
GUIStyle? styleLabel;
|
||||||
|
|
||||||
|
public static void Display()
|
||||||
|
{
|
||||||
|
// Get existing open window or if none, make a new one:
|
||||||
|
var window = GetWindow<AboutWindow>();
|
||||||
|
window.Show();
|
||||||
|
|
||||||
|
Serilog.Log.Debug("Displaying about window");
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendAnalyticsEvent("Gui", "AboutWindow_Display");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
//**--icon
|
||||||
|
//var icon = AssetDatabase.LoadAssetAtPath<Texture>("Assets/Sprites/Gear.png");
|
||||||
|
//titleContent = new GUIContent("Code Assist", icon);
|
||||||
|
titleContent = new GUIContent("Code Assist About");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnGUI()
|
||||||
|
{
|
||||||
|
styleLabel ??= new GUIStyle(GUI.skin.label)
|
||||||
|
{
|
||||||
|
wordWrap = true,
|
||||||
|
alignment = TextAnchor.MiddleLeft,
|
||||||
|
};
|
||||||
|
|
||||||
|
EditorGUILayout.LabelField($"Version number: {Assister.Version}", styleLabel, GUILayout.ExpandWidth(true));
|
||||||
|
|
||||||
|
#if MERYEL_UCA_LITE_VERSION
|
||||||
|
EditorGUILayout.LabelField($"License type: Lite", styleLabel, GUILayout.ExpandWidth(true));
|
||||||
|
#else // MERYEL_UCA_LITE_VERSION
|
||||||
|
EditorGUILayout.LabelField($"License type: Full", styleLabel, GUILayout.ExpandWidth(true));
|
||||||
|
#endif // MERYEL_UCA_LITE_VERSION
|
||||||
|
|
||||||
|
if (GUILayout.Button("Update"))
|
||||||
|
{
|
||||||
|
Updater.CheckUpdateForced();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("View changelog"))
|
||||||
|
{
|
||||||
|
Application.OpenURL("https://unitycodeassist.netlify.app/changelog");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("View third party notices"))
|
||||||
|
{
|
||||||
|
Application.OpenURL("https://unitycodeassist.netlify.app/thirdpartynotices");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b773a1d4b9561324fa0bc568c62c3770
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
// according to documentation, https://docs.unity3d.com/2023.2/Documentation/Manual/roslyn-analyzers.html
|
||||||
|
// if analyzers are under any asmdef file, they are bound to the asmdef's scope
|
||||||
|
// to declare out analyzers globally, had to write custom AssetPostprocessor and don't use "RoslynAnalyzer" asset label
|
||||||
|
|
||||||
|
public class AnalyzerPostProcessor : AssetPostprocessor
|
||||||
|
{
|
||||||
|
public static string OnGeneratedCSProject(string path, string content)
|
||||||
|
{
|
||||||
|
// do not add roslyn analyzers to Visual Studio projects for performance
|
||||||
|
if (Assister.GetCodeEditor(false, out var isVisualStudio, out _, out _) && isVisualStudio)
|
||||||
|
return content;
|
||||||
|
|
||||||
|
var analyzerGroup = new StringBuilder();
|
||||||
|
analyzerGroup.Append(NewLine);
|
||||||
|
analyzerGroup.Append(" <!--This section is added by Unity Code Assist-->");
|
||||||
|
analyzerGroup.Append(NewLine);
|
||||||
|
analyzerGroup.Append(" <ItemGroup>");
|
||||||
|
|
||||||
|
var prefix = $"{NewLine} <Analyzer Include=\"{CommonTools.GetExternalReferencesPath().Replace('/', '\\')}\\";
|
||||||
|
var suffix = $"\" />";
|
||||||
|
|
||||||
|
foreach (var analyzer in Analyzers)
|
||||||
|
{
|
||||||
|
analyzerGroup.Append(prefix);
|
||||||
|
analyzerGroup.Append(analyzer);
|
||||||
|
analyzerGroup.Append(suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
analyzerGroup.Append(NewLine);
|
||||||
|
analyzerGroup.Append(" </ItemGroup>");
|
||||||
|
//analyzerGroup.Append(NewLine);
|
||||||
|
|
||||||
|
|
||||||
|
//content = Regex.Replace(content, $"[{NewLine}]*</Project>[{NewLine}]*", $"{analyzerGroup.ToString()}$&");
|
||||||
|
var matches = Regex.Matches(content, $"[{NewLine}]*</Project>");
|
||||||
|
var index = matches.LastOrDefault(m => m.Success)?.Index ?? -1;
|
||||||
|
//var index = content.LastIndexOf("</Project>");
|
||||||
|
|
||||||
|
if (index >= 0)
|
||||||
|
content = content.Insert(index, analyzerGroup.ToString());
|
||||||
|
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
private const string NewLine = "\r\n";
|
||||||
|
|
||||||
|
private readonly static string[] Analyzers = new string[]
|
||||||
|
{
|
||||||
|
#if MERYEL_UCA_LITE_VERSION
|
||||||
|
"Meryel.UnityCodeAssist.AnalyzersLite.dll",
|
||||||
|
#else
|
||||||
|
"Meryel.UnityCodeAssist.Analyzers.dll",
|
||||||
|
#endif
|
||||||
|
"Meryel.UnityCodeAssist.Common.dll",
|
||||||
|
"Meryel.UnityCodeAssist.Completion.dll",
|
||||||
|
"Meryel.UnityCodeAssist.CompletionInternals.dll",
|
||||||
|
"Meryel.UnityCodeAssist.Logger.dll",
|
||||||
|
"Meryel.UnityCodeAssist.MQTTnet.dll",
|
||||||
|
"Meryel.UnityCodeAssist.MQTTnet.Extensions.ManagedClient.dll",
|
||||||
|
"Meryel.UnityCodeAssist.Newtonsoft.Json.dll",
|
||||||
|
"Meryel.UnityCodeAssist.ProjectData.dll",
|
||||||
|
"Meryel.UnityCodeAssist.RoslynAnalyzerManager.dll",
|
||||||
|
"Meryel.UnityCodeAssist.Synchronizer.dll",
|
||||||
|
"Meryel.UnityCodeAssist.SynchronizerModel.dll",
|
||||||
|
"Meryel.UnityCodeAssist.VSIXLibrary.dll",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 17f8bf228c22bbb438ef36b16a18652c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
609
Packages/com.merry-yellow.code-assist/Editor/Assister.cs
Normal file
609
Packages/com.merry-yellow.code-assist/Editor/Assister.cs
Normal file
@@ -0,0 +1,609 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
using CodeEditor = Unity.CodeEditor.CodeEditor;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
public class Assister
|
||||||
|
{
|
||||||
|
public const string Version = "1.4.19"; //do NOT modify this line, except the number value, its being used by VSCode/Typescript for version detection (in exporter.ts.getVersionOfUnitySide())
|
||||||
|
|
||||||
|
#if MERYEL_UCA_LITE_VERSION
|
||||||
|
public const string Title = "Code Assist Lite";
|
||||||
|
#else
|
||||||
|
public const string Title = "Code Assist";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/Status", false, 1)]
|
||||||
|
static void DisplayStatusWindow()
|
||||||
|
{
|
||||||
|
StatusWindow.Display();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/Synchronize", false, 2)]
|
||||||
|
static void Sync()
|
||||||
|
{
|
||||||
|
EditorCoroutines.EditorCoroutineUtility.StartCoroutine(SyncAux(), MQTTnetInitializer.Publisher);
|
||||||
|
|
||||||
|
//MQTTnetInitializer.Publisher.SendConnect();
|
||||||
|
//Serilog.Log.Information("Code Assist is looking for more IDEs to connect to...");
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendAnalyticsEvent("Gui", "Synchronize_MenuItem");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/Report error", false, 91)]
|
||||||
|
static void DisplayFeedbackWindow()
|
||||||
|
{
|
||||||
|
FeedbackWindow.Display();
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/About", false, 92)]
|
||||||
|
static void DisplayAboutWindow()
|
||||||
|
{
|
||||||
|
AboutWindow.Display();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if MERYEL_UCA_LITE_VERSION
|
||||||
|
[MenuItem("Tools/" + Title + "/Compare versions", false, 31)]
|
||||||
|
static void CompareVersions()
|
||||||
|
{
|
||||||
|
Application.OpenURL("http://unitycodeassist.netlify.app/compare");
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendAnalyticsEvent("Gui", "CompareVersions_MenuItem");
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/Get full version", false, 32)]
|
||||||
|
static void GetFullVersion()
|
||||||
|
{
|
||||||
|
Application.OpenURL("https://unitycodeassist.netlify.app/purchase?utm_source=unity_getfull");
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendAnalyticsEvent("Gui", "FullVersion_MenuItem");
|
||||||
|
}
|
||||||
|
#endif // MERYEL_UCA_LITE_VERSION
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/Setup/Upgrade to full version", false, 65)]
|
||||||
|
public static void Upgrade()
|
||||||
|
{
|
||||||
|
MQTTnetInitializer.Publisher?.SendAnalyticsEvent("Gui", "Upgrade_MenuItem");
|
||||||
|
|
||||||
|
#if MERYEL_UCA_LITE_VERSION
|
||||||
|
Serilog.Log.Information("Purchase <a href=\"https://unitycodeassist.netlify.app/purchase?utm_source=unity_upgrade\">Unity Code Assist</a> from the <a href=\"http://u3d.as/2N2H\">Asset Store</a> or <a href=\"https://meryel.itch.io/unity-code-assist\">itch.io</a> first. Then download it from the package manager or itch.io");
|
||||||
|
return;
|
||||||
|
#else
|
||||||
|
if (GetCodeEditor(true, out var isVisualStudio, out var isVisualStudioCode, out var error))
|
||||||
|
{
|
||||||
|
if (isVisualStudio)
|
||||||
|
{
|
||||||
|
var vsixPath = CommonTools.GetInstallerPath("CodeAssist.Full.VisualStudio.Installer.vsix");
|
||||||
|
if (System.IO.File.Exists(vsixPath))
|
||||||
|
{
|
||||||
|
CallVisualStudioInstaller(vsixPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var zipPath = CommonTools.GetInstallerPath("CodeAssist.Full.VisualStudio.Installer.zip");
|
||||||
|
if (System.IO.File.Exists(zipPath))
|
||||||
|
{
|
||||||
|
var tempVsixPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "CodeAssist.Full.VisualStudio.Installer.vsix");
|
||||||
|
System.IO.File.Copy(zipPath, tempVsixPath, true);
|
||||||
|
|
||||||
|
CallVisualStudioInstaller(tempVsixPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serilog.Log.Information("Installer for Visual Studio couldn't be found at {ZipPath}. Please try re-importing the asset from the package manager", zipPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (isVisualStudioCode)
|
||||||
|
{
|
||||||
|
var vsixPath = CommonTools.GetInstallerPath("CodeAssist.Full.VSCode.Installer.vsix");
|
||||||
|
if (System.IO.File.Exists(vsixPath))
|
||||||
|
{
|
||||||
|
CallVSCodeInstaller(vsixPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var zipPath = CommonTools.GetInstallerPath("CodeAssist.Full.VSCode.Installer.zip");
|
||||||
|
if (System.IO.File.Exists(zipPath))
|
||||||
|
{
|
||||||
|
var tempVsixPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "CodeAssist.Full.VSCode.Installer.vsix");
|
||||||
|
System.IO.File.Copy(zipPath, tempVsixPath, true);
|
||||||
|
|
||||||
|
CallVSCodeInstaller(tempVsixPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serilog.Log.Information("Installer for VS Code couldn't be found at {ZipPath}. Please try re-importing the asset from the package manager", zipPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serilog.Log.Information(error!);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
[MenuItem("Tools/" + Title + "/Setup/Update", false, 61)]
|
||||||
|
static void Update()
|
||||||
|
{
|
||||||
|
//UnityEditor.PackageManager.Client.
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/Setup/Re-import package", false, 62)]
|
||||||
|
static void RepairFiles()
|
||||||
|
{
|
||||||
|
if (MQTTnetInitializer.Publisher?.Clients.Any() != true)
|
||||||
|
Serilog.Log.Information("No connected IDE found. Please start up Visual Studio or VS Code first");
|
||||||
|
|
||||||
|
//var cleanupPath = CommonTools.GetToolPath("CleanupObsoleteFiles.bat");
|
||||||
|
//Execute(cleanupPath);
|
||||||
|
Cleanup.DoCleanup();
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendRequestUpdate("Unity", string.Empty, true);
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendAnalyticsEvent("Gui", "Reimport_MenuItem");
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/Setup/Import files for .NET Standard 2.0", false, 63)]
|
||||||
|
static void ImportSystemBinariesForDotNetStandard20()
|
||||||
|
{
|
||||||
|
var solutionDirectory = CommonTools.GetProjectPath();
|
||||||
|
var cSharpVersion = Cleanup.GetCSharpVersionFromUnityProjectVersionFile(solutionDirectory);
|
||||||
|
|
||||||
|
if (cSharpVersion >= 9)
|
||||||
|
{
|
||||||
|
if (!EditorUtility.DisplayDialog("Import files for .NET Standard 2.0",
|
||||||
|
"This is not required for versions of Unity 2021.2 and newer. Do you still want to continue?",
|
||||||
|
"Okay", "Cancel"))
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("ImportNetStandard20_MenuItem cancelled via confirm dialog");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MQTTnetInitializer.Publisher?.Clients.Any() != true)
|
||||||
|
Serilog.Log.Information("No connected IDE found. Please start up Visual Studio or VS Code first");
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendRequestUpdate("SystemBinariesForDotNetStandard20", string.Empty, true);
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendAnalyticsEvent("Gui", "ImportNetStandard20_MenuItem");
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Tools/" + Title + "/Setup/Regenerate project files", false, 64)]
|
||||||
|
public static void RegenerateProjectFiles() => RegenerateProjectFilesAux(true);
|
||||||
|
|
||||||
|
public static void RegenerateProjectFilesAux(bool showError)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (GetCodeEditor(true, out _, out _, out var error))
|
||||||
|
{
|
||||||
|
CodeEditor.Editor.CurrentCodeEditor.SyncAll();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (showError && error != null)
|
||||||
|
Serilog.Log.Information(error);
|
||||||
|
|
||||||
|
// other similar approaches
|
||||||
|
// https://www.reddit.com/r/Unity3D/comments/s1joc6/help_with_generating_csproj_and_sln_for_github/
|
||||||
|
// https://discussions.unity.com/t/manually-generate-sln-and-csproj-files/648686/6
|
||||||
|
// https://discussions.unity.com/t/how-can-i-generate-csproj-files-during-continuous-integration-builds/842493/3
|
||||||
|
// https://github.com/Unity-Technologies/UnityCsReference/blob/f45f297f342239326ea865a57a1bb8ddf93e38c6/Editor/Mono/CodeEditor/SyncVS.cs#L22
|
||||||
|
var t = ScriptFinder.GetType123("Microsoft.Unity.VisualStudio.Editor.Cli");
|
||||||
|
var m = t!.GetMethod("GenerateSolution", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
|
||||||
|
m.Invoke(null, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (System.Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(ex, "Couldn't invoke GenerateSolution");
|
||||||
|
Serilog.Log.Information("Please 'Regenerate project files' manually. 'Edit'->'Preferences'->'External Tools'->'Regenerate project files'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static IEnumerator CallShell(string command, string ide)
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("calling shell with command: {Command}", command);
|
||||||
|
var task = Shell.UnityEditorShell.Execute(command);
|
||||||
|
task.OnLog += (logType, log) =>
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("shell log: {Log}", log);
|
||||||
|
};
|
||||||
|
task.OnExit += (code) =>
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("shell exit: {Code}", code);
|
||||||
|
if (code == 0)
|
||||||
|
Serilog.Log.Information($"{ide} extension installed successfully. Please restart {ide}");
|
||||||
|
else
|
||||||
|
Serilog.Log.Information($"{ide} extension installation failed. Please try manual installition at {CommonTools.GetInstallerPath(string.Empty)}");
|
||||||
|
};
|
||||||
|
yield return new Shell.ShellCommandYieldable(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CallVisualStudioInstaller(string vsixPath)
|
||||||
|
{
|
||||||
|
EditorCoroutines.EditorCoroutineUtility.StartCoroutine(CallShell(
|
||||||
|
$"@for /f \"usebackq delims=\" %i in (`\"%ProgramFiles(x86)%\\Microsoft Visual Studio\\Installer\\vswhere.exe\" -latest -prerelease -products * -property enginePath`) do @set enginePath=%i & if exist \"%i\\VSIXInstaller.exe\" call \"%i\\VSIXInstaller.exe\" /u:VSIXLite2.6815b720-6186-48a1-a405-1387e54b41c6 & call \"%i\\VSIXInstaller.exe\" \"{vsixPath}\"", "Visual Studio"), MQTTnetInitializer.Publisher);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CallVSCodeInstaller(string vsixPath)
|
||||||
|
{
|
||||||
|
string command;
|
||||||
|
#if UNITY_EDITOR_WIN
|
||||||
|
command = $"code --uninstall-extension MerryYellow.uca-lite-vscode & code --install-extension \"{vsixPath}\"";
|
||||||
|
#elif UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX
|
||||||
|
command = $"code --uninstall-extension MerryYellow.uca-lite-vscode ; code --install-extension \"{vsixPath}\"";
|
||||||
|
#else
|
||||||
|
Serilog.Log.Error("invalid platform at {Location}", nameof(CallVSCodeInstaller));
|
||||||
|
command = string.Empty;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EditorCoroutines.EditorCoroutineUtility.StartCoroutine(CallShell(command, "VS Code"), MQTTnetInitializer.Publisher);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Execute(string vsixPath, bool isVisualStudio = false, bool isVSCode = false)
|
||||||
|
{
|
||||||
|
var startInfo = new System.Diagnostics.ProcessStartInfo
|
||||||
|
{
|
||||||
|
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
|
||||||
|
//startInfo.FileName = GetExePath();
|
||||||
|
FileName = vsixPath,
|
||||||
|
//startInfo.Arguments = args;
|
||||||
|
UseShellExecute = false,
|
||||||
|
RedirectStandardOutput = true
|
||||||
|
//startInfo.WorkingDirectory = workingDirectoryPath;
|
||||||
|
};
|
||||||
|
var process = new System.Diagnostics.Process
|
||||||
|
{
|
||||||
|
StartInfo = startInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
process.Start();
|
||||||
|
}
|
||||||
|
catch (System.ComponentModel.Win32Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(ex, "Error at running bat file {File}", vsixPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
string output = process.StandardOutput.ReadToEnd();
|
||||||
|
process.WaitForExit();
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static IEnumerator SyncAux()
|
||||||
|
{
|
||||||
|
var clientCount = MQTTnetInitializer.Publisher?.Clients.Count() ?? 0;
|
||||||
|
MQTTnetInitializer.Publisher?.SendConnect();
|
||||||
|
Serilog.Log.Information("Code Assist is looking for more IDEs to connect to...");
|
||||||
|
|
||||||
|
//yield return new WaitForSeconds(3);
|
||||||
|
yield return new EditorCoroutines.EditorWaitForSeconds(3);
|
||||||
|
|
||||||
|
var newClientCount = MQTTnetInitializer.Publisher?.Clients.Count() ?? 0;
|
||||||
|
|
||||||
|
var dif = newClientCount - clientCount;
|
||||||
|
|
||||||
|
if (dif <= 0)
|
||||||
|
Serilog.Log.Information("Code Assist couldn't find any new IDE to connect to.");
|
||||||
|
else
|
||||||
|
Serilog.Log.Information("Code Assist is connected to {Dif} new IDE(s).", dif);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if MERYEL_DEBUG
|
||||||
|
|
||||||
|
[MenuItem("Code Assist/Binary2Text")]
|
||||||
|
static void Binary2Text()
|
||||||
|
{
|
||||||
|
var filePath = CommonTools.GetInputManagerFilePath();
|
||||||
|
var hash = Input.UnityInputManager.GetMD5Hash(filePath);
|
||||||
|
var convertedPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), $"UCA_IM_{hash}.txt");
|
||||||
|
|
||||||
|
var b = new Input.Binary2TextExec();
|
||||||
|
b.Exec(filePath, convertedPath, detailed: false, largeBinaryHashOnly: false, hexFloat: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Code Assist/Bump InputManager")]
|
||||||
|
static void BumpInputManager()
|
||||||
|
{
|
||||||
|
Input.InputManagerMonitor.Instance.Bump();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MenuItem("Code Assist/Layer Check")]
|
||||||
|
static void UpdateLayers()
|
||||||
|
{
|
||||||
|
var names = UnityEditorInternal.InternalEditorUtility.layers;
|
||||||
|
var indices = names.Select(l => LayerMask.NameToLayer(l).ToString()).ToArray();
|
||||||
|
MQTTnetInitializer.Publisher?.SendLayers(indices, names);
|
||||||
|
|
||||||
|
var sls = SortingLayer.layers;
|
||||||
|
var sortingNames = sls.Select(sl => sl.name).ToArray();
|
||||||
|
var sortingIds = sls.Select(sl => sl.id.ToString()).ToArray();
|
||||||
|
var sortingValues = sls.Select(sl => sl.value.ToString()).ToArray();
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendSortingLayers(sortingNames, sortingIds, sortingValues);
|
||||||
|
|
||||||
|
/*
|
||||||
|
for (var i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
var name = LayerMask.LayerToName(i);
|
||||||
|
if (!string.IsNullOrEmpty(name))
|
||||||
|
{
|
||||||
|
Debug.Log(i + ":" + name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ScriptFinder.FindGameObjectOfType("Deneme", out var go))
|
||||||
|
MQTTnetInitializer.Publisher.SendGameObject(go);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Code Assist/Tag Check")]
|
||||||
|
static void UpdateTags()
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("Listing tags {Count}", UnityEditorInternal.InternalEditorUtility.tags.Length);
|
||||||
|
|
||||||
|
foreach (var tag in UnityEditorInternal.InternalEditorUtility.tags)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(tag))
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("{Tag}", tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendTags(UnityEditorInternal.InternalEditorUtility.tags);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Code Assist/GO Check")]
|
||||||
|
|
||||||
|
static void TestGO()
|
||||||
|
{
|
||||||
|
|
||||||
|
var go = GameObject.Find("Deneme");
|
||||||
|
//var go = MonoBehaviour.FindObjectOfType<Deneme>().gameObject;
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendGameObject(go);
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Code Assist/Undo Records Test")]
|
||||||
|
static void UndoTest()
|
||||||
|
{
|
||||||
|
var undos = new List<string>();
|
||||||
|
var redos = new List<string>();
|
||||||
|
|
||||||
|
var type = typeof(Undo);
|
||||||
|
System.Reflection.MethodInfo dynMethod = type.GetMethod("GetRecords",
|
||||||
|
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
|
||||||
|
dynMethod.Invoke(null, new object[] { undos, redos });
|
||||||
|
|
||||||
|
Serilog.Log.Debug("undos:{UndoCount},redos:{RedoCount}", undos.Count, redos.Count);
|
||||||
|
|
||||||
|
var last = undos.LastOrDefault();
|
||||||
|
if (last != null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("last:{Last}", last);
|
||||||
|
Serilog.Log.Debug("group:{UndoCurrentGroup},{UndoCurrentGroupName}",
|
||||||
|
Undo.GetCurrentGroup(), Undo.GetCurrentGroupName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MenuItem("Code Assist/Undo List Test")]
|
||||||
|
static void Undo2Test()
|
||||||
|
{
|
||||||
|
|
||||||
|
//List<string> undoList, out int undoCursor
|
||||||
|
var undoList = new List<string>();
|
||||||
|
int undoCursor = int.MaxValue;
|
||||||
|
var type = typeof(Undo);
|
||||||
|
System.Reflection.MethodInfo dynMethod = type.GetMethod("GetUndoList",
|
||||||
|
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
|
||||||
|
|
||||||
|
dynMethod = type.GetMethod("GetUndoList",
|
||||||
|
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static,
|
||||||
|
null,
|
||||||
|
new System.Type[] { typeof(List<string>), typeof(int).MakeByRefType() },
|
||||||
|
null);
|
||||||
|
|
||||||
|
|
||||||
|
dynMethod.Invoke(null, new object[] { undoList, undoCursor });
|
||||||
|
|
||||||
|
Serilog.Log.Debug("undo count: {Count}", undoList.Count);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("Code Assist/Reload Domain")]
|
||||||
|
static void ReloadDomain()
|
||||||
|
{
|
||||||
|
EditorUtility.RequestScriptReload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
[MenuItem("Code Assist/TEST")]
|
||||||
|
static void TEST()
|
||||||
|
{
|
||||||
|
//if (ScriptFinder.FindGameObjectOfType("Deneme_OtherScene", out var go))
|
||||||
|
if (ScriptFinder.FindInstanceOfType("Deneme_SO", out var go, out var so))
|
||||||
|
{
|
||||||
|
MQTTnetInitializer.Publisher.SendScriptableObject(so);
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptFinder.DENEMEEEE();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // MERYEL_DEBUG
|
||||||
|
|
||||||
|
|
||||||
|
public static void SendTagsAndLayers()
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug(nameof(SendTagsAndLayers));
|
||||||
|
|
||||||
|
var tags = UnityEditorInternal.InternalEditorUtility.tags;
|
||||||
|
MQTTnetInitializer.Publisher?.SendTags(tags);
|
||||||
|
|
||||||
|
var layerNames = UnityEditorInternal.InternalEditorUtility.layers;
|
||||||
|
var layerIndices = layerNames.Select(l => LayerMask.NameToLayer(l).ToString()).ToArray();
|
||||||
|
MQTTnetInitializer.Publisher?.SendLayers(layerNames, layerIndices);
|
||||||
|
|
||||||
|
var sls = SortingLayer.layers;
|
||||||
|
var sortingNames = sls.Select(sl => sl.name).ToArray();
|
||||||
|
var sortingIds = sls.Select(sl => sl.id.ToString()).ToArray();
|
||||||
|
var sortingValues = sls.Select(sl => sl.value.ToString()).ToArray();
|
||||||
|
MQTTnetInitializer.Publisher?.SendSortingLayers(sortingNames, sortingIds, sortingValues);
|
||||||
|
|
||||||
|
#if UNITY_6000_0_OR_NEWER
|
||||||
|
// Version 6+ only, 2022.3 doesn't have class RenderingLayerMask, even though some renderingLayerMask fields/properties are declared
|
||||||
|
|
||||||
|
var renderingLayerCount = RenderingLayerMask.GetRenderingLayerCount();
|
||||||
|
var renderingLayerIndices = new string[renderingLayerCount];
|
||||||
|
var renderingLayerNames = new string[renderingLayerCount];
|
||||||
|
for (var i = 0; i < renderingLayerCount; i++)
|
||||||
|
{
|
||||||
|
renderingLayerIndices[i] = i.ToString();
|
||||||
|
renderingLayerNames[i] = RenderingLayerMask.RenderingLayerToName(i);
|
||||||
|
}
|
||||||
|
MQTTnetInitializer.Publisher?.SendRenderingLayers(renderingLayerNames, renderingLayerIndices);
|
||||||
|
|
||||||
|
#endif // UNITY_6000_0_OR_NEWER
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool GetCodeEditor(bool checkVersion, out bool isVisualStudio, out bool isVisualStudioCode, out string? error)
|
||||||
|
{
|
||||||
|
isVisualStudio = false;
|
||||||
|
isVisualStudioCode = false;
|
||||||
|
|
||||||
|
if (CodeEditor.Editor.CurrentCodeEditor.TryGetInstallationForPath(CodeEditor.CurrentEditorInstallation, out var installation))
|
||||||
|
{
|
||||||
|
if (installation.Name.StartsWith("Visual Studio Code"))
|
||||||
|
isVisualStudioCode = true;
|
||||||
|
else if (installation.Name.StartsWith("Visual Studio"))
|
||||||
|
isVisualStudio = true;
|
||||||
|
|
||||||
|
if (!isVisualStudioCode && !isVisualStudio)
|
||||||
|
{
|
||||||
|
error = $"Unsupported code editor: {installation.Name}. Unity Code Assist only supports Visual Studio and Visual Studio Code";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (installation.Name.Contains("(internal)"))
|
||||||
|
{
|
||||||
|
error = "Code editor set but not working properly. Please try updating 'Visual Studio Editor' package";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!checkVersion)
|
||||||
|
{
|
||||||
|
error = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var versionRegex = new System.Text.RegularExpressions.Regex(".*\\[([\\d\\.]+)\\]");
|
||||||
|
var versionStr = versionRegex.Match(installation.Name).Groups.ElementAtOrDefault(1)?.Value;
|
||||||
|
|
||||||
|
if (isVisualStudioCode && !string.IsNullOrEmpty(versionStr) && (VersionCompare(versionStr!, "1.76") < 0))
|
||||||
|
{
|
||||||
|
error = $"Version {versionStr} of Visual Studio Code is not supported by Unity Code Assist. Please update Visual Studio Code";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isVisualStudio && !string.IsNullOrEmpty(versionStr) && (VersionCompare(versionStr!, "17") < 0))
|
||||||
|
{
|
||||||
|
error = $"Version {versionStr} of Visual Studio is not supported by Unity Code Assist. Please update Visual Studio";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error = "No code editor found. Please set it through 'Edit'->'Preferences'->'External Tools'->'External Script Editor'";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//https://www.geeksforgeeks.org/compare-two-version-numbers/amp/
|
||||||
|
public static int VersionCompare(string v1, string v2)
|
||||||
|
{
|
||||||
|
// vnum stores each numeric
|
||||||
|
|
||||||
|
// part of version
|
||||||
|
|
||||||
|
int vnum1 = 0, vnum2 = 0;
|
||||||
|
|
||||||
|
// loop until both string are
|
||||||
|
// processed
|
||||||
|
|
||||||
|
for (int i = 0, j = 0; (i < v1.Length || j < v2.Length);)
|
||||||
|
|
||||||
|
{
|
||||||
|
// storing numeric part of
|
||||||
|
// version 1 in vnum1
|
||||||
|
while (i < v1.Length && v1[i] != '.')
|
||||||
|
{
|
||||||
|
|
||||||
|
vnum1 = vnum1 * 10 + (v1[i] - '0');
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
// storing numeric part of
|
||||||
|
|
||||||
|
// version 2 in vnum2
|
||||||
|
|
||||||
|
while (j < v2.Length && v2[j] != '.')
|
||||||
|
{
|
||||||
|
vnum2 = vnum2 * 10 + (v2[j] - '0');
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
if (vnum1 > vnum2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (vnum2 > vnum1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// if equal, reset variables and
|
||||||
|
|
||||||
|
// go for next numeric part
|
||||||
|
vnum1 = vnum2 = 0;
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 394bf783968f6dd4ab2ca0e1e7258147
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
390
Packages/com.merry-yellow.code-assist/Editor/Cleanup.cs
Normal file
390
Packages/com.merry-yellow.code-assist/Editor/Cleanup.cs
Normal file
@@ -0,0 +1,390 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.AccessControl;
|
||||||
|
using System.Security.Principal;
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
|
||||||
|
// copied from Exporter.cs in VSIX
|
||||||
|
public static class Cleanup
|
||||||
|
{
|
||||||
|
public static bool DoCleanup()
|
||||||
|
{
|
||||||
|
var assetsPath = UnityEngine.Application.dataPath;
|
||||||
|
|
||||||
|
var _solutionDirectory = CommonTools.GetProjectPath();
|
||||||
|
var destination = _solutionDirectory;
|
||||||
|
var oldDestination = assetsPath;
|
||||||
|
|
||||||
|
|
||||||
|
var succeed = true;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Cleanup1(oldDestination);
|
||||||
|
Cleanup2(oldDestination);
|
||||||
|
Cleanup3(oldDestination, _solutionDirectory);
|
||||||
|
Cleanup4(oldDestination);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
succeed = false;
|
||||||
|
Serilog.Log.Error(ex, "DoCleanup failed at {Destination}", destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
return succeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void DeleteFileAndItsMeta(string filePath)
|
||||||
|
{
|
||||||
|
if (File.Exists(filePath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("Deleting file {File}", filePath);
|
||||||
|
//File.Delete(filePath);
|
||||||
|
DeleteFileAux(filePath);
|
||||||
|
Serilog.Log.Debug("Deleted file {File} {Exists}", filePath, File.Exists(filePath));
|
||||||
|
}
|
||||||
|
var metaFilePath = filePath + ".meta";
|
||||||
|
if (File.Exists(metaFilePath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("Deleting meta file {File}", metaFilePath);
|
||||||
|
//File.Delete(metaFilePath);
|
||||||
|
DeleteFileAux(metaFilePath);
|
||||||
|
Serilog.Log.Debug("Deleted file {File} {Exists}", metaFilePath, File.Exists(metaFilePath));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsDirectoryExistsAndEmpty(string path)
|
||||||
|
{
|
||||||
|
return Directory.Exists(path) && !Directory.EnumerateFileSystemEntries(path).Any();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void DeleteDirectoryAndItsMeta(string directoryPath)
|
||||||
|
{
|
||||||
|
if (IsDirectoryExistsAndEmpty(directoryPath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("Deleting directory {Dir}", directoryPath);
|
||||||
|
Directory.Delete(directoryPath);
|
||||||
|
Serilog.Log.Debug("Deleted directory {Dir} {Exists}", directoryPath, IsDirectoryExistsAndEmpty(directoryPath));
|
||||||
|
|
||||||
|
var metaFilePath = directoryPath + ".meta";
|
||||||
|
if (File.Exists(metaFilePath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("Deleting directory meta file {File}", metaFilePath);
|
||||||
|
//File.Delete(metaFilePath);
|
||||||
|
DeleteFileAux(metaFilePath);
|
||||||
|
Serilog.Log.Debug("Deleted directory meta file {File} {Exists}", metaFilePath, File.Exists(metaFilePath));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void DeleteFileAux(string filePath)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(filePath);
|
||||||
|
}
|
||||||
|
catch (UnauthorizedAccessException)
|
||||||
|
{
|
||||||
|
var fileDirectoryPath = Path.GetDirectoryName(filePath);
|
||||||
|
SetEveryoneAccessToDirectory(fileDirectoryPath, out _);
|
||||||
|
TakeOwnership(filePath);
|
||||||
|
File.Delete(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set Everyone Full Control permissions for selected directory
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dirName"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
static bool SetEveryoneAccessToDirectory(string dirName, out string _lastError)
|
||||||
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Make sure directory exists
|
||||||
|
if (Directory.Exists(dirName) == false)
|
||||||
|
throw new Exception(string.Format("Directory {0} does not exist, so permissions cannot be set.", dirName));
|
||||||
|
|
||||||
|
// Get directory access info
|
||||||
|
DirectoryInfo dinfo = new DirectoryInfo(dirName);
|
||||||
|
DirectorySecurity dSecurity = dinfo.GetAccessControl();
|
||||||
|
|
||||||
|
// Add the FileSystemAccessRule to the security settings.
|
||||||
|
dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
|
||||||
|
|
||||||
|
// Set the access control
|
||||||
|
dinfo.SetAccessControl(dSecurity);
|
||||||
|
|
||||||
|
_lastError = String.Format("Everyone FullControl Permissions were set for directory {0}", dirName);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_lastError = ex.Message;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="solutionDirectory"></param>
|
||||||
|
/// <param name="cs_7_3_orLower"></param>
|
||||||
|
/// <param name="cs_8_0"></param>
|
||||||
|
/// <param name="cs_9_0_orHigher"></param>
|
||||||
|
/// <returns>
|
||||||
|
/// 7 if C# 7.3 or lower,
|
||||||
|
/// 8 if C# 8.0 (.netstandard2.0),
|
||||||
|
/// 9 if C# 9.0 (.netstandard2.1),
|
||||||
|
/// -1 if error
|
||||||
|
/// </returns>
|
||||||
|
public static int GetCSharpVersionFromUnityProjectVersionFile(string? solutionDirectory)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(solutionDirectory))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
var projectVersionFilePath = System.IO.Path.Combine(solutionDirectory, "ProjectSettings/ProjectVersion.txt");
|
||||||
|
if (!System.IO.File.Exists(projectVersionFilePath))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
|
||||||
|
string? version = null;
|
||||||
|
string[]? readText = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
readText = System.IO.File.ReadAllLines(projectVersionFilePath);
|
||||||
|
// format is m_EditorVersion: 2018.2.0b7
|
||||||
|
string[] versionText = readText[0].Split(' ');
|
||||||
|
version = versionText[1];
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(ex, "Project version file parsing error {FirstLine}", readText?.FirstOrDefault());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version == null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("Parsed project version is null");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// see my personal notes for Unity version X C# version table
|
||||||
|
// which is at OneNote->ShinSekai->CEPostRelease->UnityCompilerC#VersionTable
|
||||||
|
|
||||||
|
if (version.StartsWith("5.") || version.StartsWith("2017.") ||
|
||||||
|
version.StartsWith("2018.") || version.StartsWith("2019.") || version.StartsWith("2020.1."))
|
||||||
|
return 7;
|
||||||
|
|
||||||
|
if (version.StartsWith("2020.") || version.StartsWith("2021.1."))
|
||||||
|
return 8;
|
||||||
|
|
||||||
|
if (version.StartsWith("2021.") || version.StartsWith("2022.") ||
|
||||||
|
version.StartsWith("2023.") || version.StartsWith("6000."))
|
||||||
|
return 9;
|
||||||
|
|
||||||
|
Serilog.Log.Error("Parsed project version is unknown {Version}", version);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void TakeOwnership(string filename)
|
||||||
|
{
|
||||||
|
// Remove read-only attribute
|
||||||
|
File.SetAttributes(filename, File.GetAttributes(filename) & ~FileAttributes.ReadOnly);
|
||||||
|
|
||||||
|
FileSecurity security = new FileSecurity();
|
||||||
|
|
||||||
|
SecurityIdentifier sid = WindowsIdentity.GetCurrent().User;
|
||||||
|
security.SetOwner(sid);
|
||||||
|
security.SetAccessRule(new FileSystemAccessRule(sid, FileSystemRights.FullControl, AccessControlType.Allow));
|
||||||
|
|
||||||
|
File.SetAccessControl(filename, security);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Cleanup1(string destination)
|
||||||
|
{
|
||||||
|
// prior to version UCA.v.1.1.9, syncronizerModel and yamlDotNet dll files were located at ProjectPath/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Release/netstandard2.0
|
||||||
|
// with version UCA.v.1.1.9 and newer versions, they are located at ProjectPath/Assets/Plugins/CodeAssist/Editor/ExternalReferences
|
||||||
|
// delete ProjectPath/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Release
|
||||||
|
var oldBinariesDirectory = Path.Combine(destination, "Plugins/CodeAssist/Editor/ExternalReferences/Release/netstandard2.0");
|
||||||
|
if (Directory.Exists(oldBinariesDirectory))
|
||||||
|
{
|
||||||
|
// dont just delete the directory for security reasons, instead delete binary files one by one
|
||||||
|
|
||||||
|
Serilog.Log.Debug("Old binaries directory exists at {Location}", oldBinariesDirectory);
|
||||||
|
|
||||||
|
var files = new string[]
|
||||||
|
{
|
||||||
|
"UnityCodeAssistSynchronizerModel.deps.json",
|
||||||
|
"UnityCodeAssistSynchronizerModel.dll",
|
||||||
|
"UnityCodeAssistSynchronizerModel.pdb",
|
||||||
|
"UnityCodeAssistYamlDotNet.deps.json",
|
||||||
|
"UnityCodeAssistYamlDotNet.dll",
|
||||||
|
"UnityCodeAssistYamlDotNet.pdb",
|
||||||
|
"UnityCodeAssistYamlDotNet.xml",
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var file in files)
|
||||||
|
{
|
||||||
|
var filePath = Path.Combine(oldBinariesDirectory, file);
|
||||||
|
DeleteFileAndItsMeta(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeleteDirectoryAndItsMeta(oldBinariesDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
var oldBinariesDirectory2 = Path.Combine(destination, "Plugins/CodeAssist/Editor/ExternalReferences/Release");
|
||||||
|
DeleteDirectoryAndItsMeta(oldBinariesDirectory2);
|
||||||
|
|
||||||
|
|
||||||
|
// also delete old vsix, it's now renamed as Meryel.UnityCodeAssist.VSIX.vsix
|
||||||
|
var oldVsixFilePath = Path.Combine(destination, "Plugins/CodeAssist/UnityCodeAssistVSIX.vsix");
|
||||||
|
DeleteFileAndItsMeta(oldVsixFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Cleanup2(string destination)
|
||||||
|
{
|
||||||
|
// with version 1.1.12, dll files has been customized (renamed and changed their namespace) (so that they dont conflict with user's other dll files, if he tries to use them)
|
||||||
|
// delete AsyncIO.dll, and use Meryel.UnityCodeAssist.AsyncIO.dll instead
|
||||||
|
var files = new string[]
|
||||||
|
{
|
||||||
|
"AsyncIO.dll",
|
||||||
|
"NaCl.dll",
|
||||||
|
"NetMQ.dll",
|
||||||
|
"Serilog.dll",
|
||||||
|
"Serilog.Sinks.PersistentFile.dll",
|
||||||
|
};
|
||||||
|
|
||||||
|
var binariesDirectory = Path.Combine(destination, "Plugins/CodeAssist/Editor/ExternalReferences");
|
||||||
|
|
||||||
|
foreach (var file in files)
|
||||||
|
{
|
||||||
|
var filePath = Path.Combine(binariesDirectory, file);
|
||||||
|
DeleteFileAndItsMeta(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Cleanup3(string destination, string solutionDirectory)
|
||||||
|
{
|
||||||
|
// as it turns out, .netstandard2.1 does not need system binaries (for C#9.0, unity versions 2021.2 and newer)
|
||||||
|
|
||||||
|
//var cSharpVersion = CommonVS.VSCommonTools.GetCSharpVersionFromUnityProjectVersionFile(solutionDirectory);
|
||||||
|
var cSharpVersion = GetCSharpVersionFromUnityProjectVersionFile(solutionDirectory);
|
||||||
|
if (cSharpVersion < 9)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var systemBinaryFiles = new string[]
|
||||||
|
{
|
||||||
|
"System.Buffers.dll",
|
||||||
|
"System.Memory.dll",
|
||||||
|
"System.Runtime.CompilerServices.Unsafe.dll",
|
||||||
|
"System.Threading.Tasks.Extensions.dll",
|
||||||
|
};
|
||||||
|
|
||||||
|
var binariesDirectory = Path.Combine(destination, "Plugins/CodeAssist/Editor/ExternalReferences");
|
||||||
|
|
||||||
|
foreach (var file in systemBinaryFiles)
|
||||||
|
{
|
||||||
|
var filePath = Path.Combine(binariesDirectory, file);
|
||||||
|
DeleteFileAndItsMeta(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Cleanup4(string destination)
|
||||||
|
{
|
||||||
|
// with version 1.2, asset directory moved from Assets/Plugins/CodeAssist to Packages/com.merry-yellow.code-assist
|
||||||
|
// so remove all files from the old directory
|
||||||
|
|
||||||
|
var directory = Path.Combine(destination, "Plugins/CodeAssist/Editor");
|
||||||
|
|
||||||
|
var content = new string[]
|
||||||
|
{
|
||||||
|
@"TinyJson/JsonWriter.cs",
|
||||||
|
@"TinyJson/JsonParser.cs",
|
||||||
|
@"Preferences/RegistryMonitor.cs",
|
||||||
|
@"Preferences/PreferenceStorageAccessor.cs",
|
||||||
|
@"Preferences/PreferenceMonitor.cs",
|
||||||
|
@"Preferences/PreferenceEntryHolder.cs",
|
||||||
|
@"Logger/UnitySink.cs",
|
||||||
|
@"Logger/MemorySink.cs",
|
||||||
|
@"Logger/ELogger.cs",
|
||||||
|
@"Logger/DomainHashEnricher.cs",
|
||||||
|
@"Logger/CommonTools.cs",
|
||||||
|
@"Logger/Attributes.cs",
|
||||||
|
@"Input/UnityInputManager.cs",
|
||||||
|
@"Input/Text2Yaml.cs",
|
||||||
|
@"Input/InputManagerMonitor.cs",
|
||||||
|
@"Input/Binary2TextExec.cs",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.xml",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.pdb",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.dll",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.pdb",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.dll",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.pdb",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.Serilog.pdb",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.Serilog.dll",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.NetMQ.xml",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.NetMQ.pdb",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.NetMQ.dll",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.NaCl.pdb",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.NaCl.dll",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.pdb",
|
||||||
|
@"ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.dll",
|
||||||
|
@"EditorCoroutines/EditorWindowCoroutineExtension.cs",
|
||||||
|
@"EditorCoroutines/EditorWaitForSeconds.cs",
|
||||||
|
@"EditorCoroutines/EditorCoroutineUtility.cs",
|
||||||
|
@"EditorCoroutines/EditorCoroutine.cs",
|
||||||
|
@"UnityClassExtensions.cs",
|
||||||
|
@"StatusWindow.cs",
|
||||||
|
@"ScriptFinder.cs",
|
||||||
|
@"NetMQPublisher.cs",
|
||||||
|
@"NetMQInitializer.cs",
|
||||||
|
@"Monitor.cs",
|
||||||
|
@"MerryYellow.CodeAssist.Editor.asmdef",
|
||||||
|
@"MainThreadDispatcher.cs",
|
||||||
|
@"LazyInitializer.cs",
|
||||||
|
@"FeedbackWindow.cs",
|
||||||
|
@"Assister.cs",
|
||||||
|
@"AboutWindow.cs",
|
||||||
|
//@"TinyJson",
|
||||||
|
//@"Preferences",
|
||||||
|
//@"Logger",
|
||||||
|
//@"Input",
|
||||||
|
//@"ExternalReferences",
|
||||||
|
//@"EditorCoroutines",
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var c in content)
|
||||||
|
{
|
||||||
|
var path = Path.Combine(directory, c);
|
||||||
|
DeleteFileAndItsMeta(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Packages/com.merry-yellow.code-assist/Editor/Cleanup.cs.meta
Normal file
11
Packages/com.merry-yellow.code-assist/Editor/Cleanup.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f03bf638663c69e41a0cc01055bc4ad4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 89fa2729f0a36ba4986391b4274c4756
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* Derived from Unity package
|
||||||
|
* https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/api/Unity.EditorCoroutines.Editor.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
//namespace Unity.EditorCoroutines.Editor
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.EditorCoroutines
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A handle to an EditorCoroutine, can be passed to <see cref="EditorCoroutineUtility">EditorCoroutineUtility</see> methods to control lifetime.
|
||||||
|
/// </summary>
|
||||||
|
public class EditorCoroutine
|
||||||
|
{
|
||||||
|
private struct YieldProcessor
|
||||||
|
{
|
||||||
|
enum DataType : byte
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
WaitForSeconds = 1,
|
||||||
|
EditorCoroutine = 2,
|
||||||
|
AsyncOP = 3,
|
||||||
|
}
|
||||||
|
struct ProcessorData
|
||||||
|
{
|
||||||
|
public DataType type;
|
||||||
|
public double targetTime;
|
||||||
|
public object current;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcessorData data;
|
||||||
|
|
||||||
|
public void Set(object yield)
|
||||||
|
{
|
||||||
|
if (yield == data.current)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var type = yield.GetType();
|
||||||
|
var dataType = DataType.None;
|
||||||
|
double targetTime = -1;
|
||||||
|
|
||||||
|
if(type == typeof(EditorWaitForSeconds))
|
||||||
|
{
|
||||||
|
targetTime = EditorApplication.timeSinceStartup + (yield as EditorWaitForSeconds).WaitTime;
|
||||||
|
dataType = DataType.WaitForSeconds;
|
||||||
|
}
|
||||||
|
else if(type == typeof(EditorCoroutine))
|
||||||
|
{
|
||||||
|
dataType = DataType.EditorCoroutine;
|
||||||
|
}
|
||||||
|
else if(type == typeof(AsyncOperation) || type.IsSubclassOf(typeof(AsyncOperation)))
|
||||||
|
{
|
||||||
|
dataType = DataType.AsyncOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = new ProcessorData { current = yield, targetTime = targetTime, type = dataType };
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MoveNext(IEnumerator enumerator)
|
||||||
|
{
|
||||||
|
var advance = data.type switch
|
||||||
|
{
|
||||||
|
DataType.WaitForSeconds => data.targetTime <= EditorApplication.timeSinceStartup,
|
||||||
|
DataType.EditorCoroutine => (data.current as EditorCoroutine).m_IsDone,
|
||||||
|
DataType.AsyncOP => (data.current as AsyncOperation).isDone,
|
||||||
|
_ => data.current == enumerator.Current,//a IEnumerator or a plain object was passed to the implementation
|
||||||
|
};
|
||||||
|
if (advance)
|
||||||
|
{
|
||||||
|
data = default;// (ProcessorData);
|
||||||
|
return enumerator.MoveNext();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal WeakReference m_Owner;
|
||||||
|
IEnumerator m_Routine;
|
||||||
|
YieldProcessor m_Processor;
|
||||||
|
|
||||||
|
bool m_IsDone;
|
||||||
|
|
||||||
|
internal EditorCoroutine(IEnumerator routine)
|
||||||
|
{
|
||||||
|
m_Owner = null;
|
||||||
|
m_Routine = routine;
|
||||||
|
EditorApplication.update += MoveNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal EditorCoroutine(IEnumerator routine, object owner)
|
||||||
|
{
|
||||||
|
m_Processor = new YieldProcessor();
|
||||||
|
m_Owner = new WeakReference(owner);
|
||||||
|
m_Routine = routine;
|
||||||
|
EditorApplication.update += MoveNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void MoveNext()
|
||||||
|
{
|
||||||
|
if (m_Owner != null && !m_Owner.IsAlive)
|
||||||
|
{
|
||||||
|
EditorApplication.update -= MoveNext;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool done = ProcessIEnumeratorRecursive(m_Routine);
|
||||||
|
m_IsDone = !done;
|
||||||
|
|
||||||
|
if (m_IsDone)
|
||||||
|
EditorApplication.update -= MoveNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
static readonly Stack<IEnumerator> kIEnumeratorProcessingStack = new Stack<IEnumerator>(32);
|
||||||
|
private bool ProcessIEnumeratorRecursive(IEnumerator enumerator)
|
||||||
|
{
|
||||||
|
var root = enumerator;
|
||||||
|
while(enumerator.Current as IEnumerator != null)
|
||||||
|
{
|
||||||
|
kIEnumeratorProcessingStack.Push(enumerator);
|
||||||
|
enumerator = enumerator.Current as IEnumerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
//process leaf
|
||||||
|
m_Processor.Set(enumerator.Current);
|
||||||
|
var result = m_Processor.MoveNext(enumerator);
|
||||||
|
|
||||||
|
while (kIEnumeratorProcessingStack.Count > 1)
|
||||||
|
{
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
result = kIEnumeratorProcessingStack.Pop().MoveNext();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
kIEnumeratorProcessingStack.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kIEnumeratorProcessingStack.Count > 0 && !result && root == kIEnumeratorProcessingStack.Pop())
|
||||||
|
{
|
||||||
|
result = root.MoveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void Stop()
|
||||||
|
{
|
||||||
|
m_Owner = null;
|
||||||
|
m_Routine = null;
|
||||||
|
EditorApplication.update -= MoveNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6c1e3c1846518ae4da27dcaf08ef85f4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
* Derived from Unity package
|
||||||
|
* https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/api/Unity.EditorCoroutines.Editor.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
//namespace Unity.EditorCoroutines.Editor
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.EditorCoroutines
|
||||||
|
{
|
||||||
|
public static class EditorCoroutineUtility
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Starts an <see cref ="EditorCoroutine">EditorCoroutine</see> with the specified owner object.
|
||||||
|
/// If the garbage collector collects the owner object, while the resulting coroutine is still executing, the coroutine will stop running.
|
||||||
|
/// <code>
|
||||||
|
/// using System.Collections;
|
||||||
|
/// using Unity.EditorCoroutines.Editor;
|
||||||
|
/// using UnityEditor;
|
||||||
|
///
|
||||||
|
/// public class ExampleWindow : EditorWindow
|
||||||
|
/// {
|
||||||
|
/// int m_Updates = 0;
|
||||||
|
/// void OnEnable()
|
||||||
|
/// {
|
||||||
|
/// EditorCoroutineUtility.StartCoroutine(CountEditorUpdates(), this);
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// IEnumerator CountEditorUpdates()
|
||||||
|
/// {
|
||||||
|
/// while (true)
|
||||||
|
/// {
|
||||||
|
/// ++m_Updates;
|
||||||
|
/// yield return null;
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// </code>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="routine"> IEnumerator to iterate over. </param>
|
||||||
|
/// <param name="owner">Object owning the coroutine. </param>
|
||||||
|
/// <remarks>
|
||||||
|
/// Only types that don't inherit from <see cref="UnityEngine.Object">UnityEngine.Object</see> will get collected the next time the GC runs instead of getting null-ed immediately.
|
||||||
|
/// </remarks>
|
||||||
|
/// <returns>A handle to an <see cref="EditorCoroutine">EditorCoroutine</see>.</returns>
|
||||||
|
public static EditorCoroutine StartCoroutine(IEnumerator routine, object owner)
|
||||||
|
{
|
||||||
|
return new EditorCoroutine(routine, owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This method starts an <see cref="EditorCoroutine">EditorCoroutine</see> without an owning object. The <see cref="EditorCoroutine">EditorCoroutine</see> runs until it completes or is canceled using <see cref="StopCoroutine(EditorCoroutine)">StopCoroutine</see>.
|
||||||
|
/// <code>
|
||||||
|
/// using System.Collections;
|
||||||
|
/// using Unity.EditorCoroutines.Editor;
|
||||||
|
/// using UnityEditor;
|
||||||
|
/// using UnityEngine;
|
||||||
|
///
|
||||||
|
/// public class ExampleWindow : EditorWindow
|
||||||
|
/// {
|
||||||
|
/// void OnEnable()
|
||||||
|
/// {
|
||||||
|
/// EditorCoroutineUtility.StartCoroutineOwnerless(LogTimeSinceStartup());
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// IEnumerator LogTimeSinceStartup()
|
||||||
|
/// {
|
||||||
|
/// while (true)
|
||||||
|
/// {
|
||||||
|
/// Debug.LogFormat("Time since startup: {0} s", Time.realtimeSinceStartup);
|
||||||
|
/// yield return null;
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// </code>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="routine"> Generator function to execute. </param>
|
||||||
|
/// <returns>A handle to an <see cref="EditorCoroutine">EditorCoroutine.</see></returns>
|
||||||
|
public static EditorCoroutine StartCoroutineOwnerless(IEnumerator routine)
|
||||||
|
{
|
||||||
|
return new EditorCoroutine(routine);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Immediately stop an <see cref="EditorCoroutine">EditorCoroutine</see>. This method is safe to call on an already completed <see cref="EditorCoroutine">EditorCoroutine</see>.
|
||||||
|
/// <code>
|
||||||
|
/// using System.Collections;
|
||||||
|
/// using Unity.EditorCoroutines.Editor;
|
||||||
|
/// using UnityEditor;
|
||||||
|
/// using UnityEngine;
|
||||||
|
///
|
||||||
|
/// public class ExampleWindow : EditorWindow
|
||||||
|
/// {
|
||||||
|
/// EditorCoroutine m_LoggerCoroutine;
|
||||||
|
/// void OnEnable()
|
||||||
|
/// {
|
||||||
|
/// m_LoggerCoroutine = EditorCoroutineUtility.StartCoroutineOwnerless(LogRunning());
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// void OnDisable()
|
||||||
|
/// {
|
||||||
|
/// EditorCoroutineUtility.StopCoroutine(m_LoggerCoroutine);
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// IEnumerator LogRunning()
|
||||||
|
/// {
|
||||||
|
/// while (true)
|
||||||
|
/// {
|
||||||
|
/// Debug.Log("Running");
|
||||||
|
/// yield return null;
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// </code>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="coroutine">A handle to an <see cref="EditorCoroutine">EditorCoroutine.</see></param>
|
||||||
|
public static void StopCoroutine(EditorCoroutine coroutine)
|
||||||
|
{
|
||||||
|
if (coroutine == null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("EditorCoroutine handle is null.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
coroutine.Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b3d162669c5693a47bf42827686f73d0
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Derived from Unity package
|
||||||
|
* https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/api/Unity.EditorCoroutines.Editor.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
//namespace Unity.EditorCoroutines.Editor
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.EditorCoroutines
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Suspends the <see cref="EditorCoroutine">EditorCoroutine</see> execution for the given amount of seconds, using unscaled time.
|
||||||
|
/// The coroutine execution continues after the specified time has elapsed.
|
||||||
|
/// <code>
|
||||||
|
/// using System.Collections;
|
||||||
|
/// using UnityEngine;
|
||||||
|
/// using Unity.EditorCoroutines.Editor;
|
||||||
|
/// using UnityEditor;
|
||||||
|
///
|
||||||
|
/// public class MyEditorWindow : EditorWindow
|
||||||
|
/// {
|
||||||
|
/// IEnumerator PrintEachSecond()
|
||||||
|
/// {
|
||||||
|
/// var waitForOneSecond = new EditorWaitForSeconds(1.0f);
|
||||||
|
///
|
||||||
|
/// while (true)
|
||||||
|
/// {
|
||||||
|
/// yield return waitForOneSecond;
|
||||||
|
/// Debug.Log("Printing each second");
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// </code>
|
||||||
|
/// </summary>
|
||||||
|
public class EditorWaitForSeconds
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The time to wait in seconds.
|
||||||
|
/// </summary>
|
||||||
|
public float WaitTime { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a instruction object for yielding inside a generator function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="time">The amount of time to wait in seconds.</param>
|
||||||
|
public EditorWaitForSeconds(float time)
|
||||||
|
{
|
||||||
|
WaitTime = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2d8612ff14468214aad7600138a50b79
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Derived from Unity package
|
||||||
|
* https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/api/Unity.EditorCoroutines.Editor.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
//namespace Unity.EditorCoroutines.Editor
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.EditorCoroutines
|
||||||
|
{
|
||||||
|
public static class EditorWindowCoroutineExtension
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Start an <see cref="EditorCoroutine">EditorCoroutine</see>, owned by the calling <see cref="EditorWindow">EditorWindow</see> instance.
|
||||||
|
/// <code>
|
||||||
|
/// using System.Collections;
|
||||||
|
/// using Unity.EditorCoroutines.Editor;
|
||||||
|
/// using UnityEditor;
|
||||||
|
///
|
||||||
|
/// public class ExampleWindow : EditorWindow
|
||||||
|
/// {
|
||||||
|
/// void OnEnable()
|
||||||
|
/// {
|
||||||
|
/// this.StartCoroutine(CloseWindowDelayed());
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// IEnumerator CloseWindowDelayed() //close the window after 1000 frames have elapsed
|
||||||
|
/// {
|
||||||
|
/// int count = 1000;
|
||||||
|
/// while (count > 0)
|
||||||
|
/// {
|
||||||
|
/// yield return null;
|
||||||
|
/// }
|
||||||
|
/// Close();
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// </code>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="routine"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static EditorCoroutine StartCoroutine(this EditorWindow window, IEnumerator routine)
|
||||||
|
{
|
||||||
|
return new EditorCoroutine(routine, window);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Immediately stop an <see cref="EditorCoroutine">EditorCoroutine</see> that was started by the calling <see cref="EditorWindow"/> instance. This method is safe to call on an already completed <see cref="EditorCoroutine">EditorCoroutine</see>.
|
||||||
|
/// <code>
|
||||||
|
/// using System.Collections;
|
||||||
|
/// using Unity.EditorCoroutines.Editor;
|
||||||
|
/// using UnityEditor;
|
||||||
|
/// using UnityEngine;
|
||||||
|
///
|
||||||
|
/// public class ExampleWindow : EditorWindow
|
||||||
|
/// {
|
||||||
|
/// EditorCoroutine coroutine;
|
||||||
|
/// void OnEnable()
|
||||||
|
/// {
|
||||||
|
/// coroutine = this.StartCoroutine(CloseWindowDelayed());
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// private void OnDisable()
|
||||||
|
/// {
|
||||||
|
/// this.StopCoroutine(coroutine);
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// IEnumerator CloseWindowDelayed()
|
||||||
|
/// {
|
||||||
|
/// while (true)
|
||||||
|
/// {
|
||||||
|
/// Debug.Log("Running");
|
||||||
|
/// yield return null;
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// </code>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="coroutine"></param>
|
||||||
|
public static void StopCoroutine(this EditorWindow window, EditorCoroutine coroutine)
|
||||||
|
{
|
||||||
|
if(coroutine == null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Provided EditorCoroutine handle is null.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(coroutine.m_Owner == null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("The EditorCoroutine is ownerless. Please use EditorCoroutineEditor.StopCoroutine to terminate such coroutines.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!coroutine.m_Owner.IsAlive)
|
||||||
|
return; //The EditorCoroutine's owner was already terminated execution will cease next time it is processed
|
||||||
|
|
||||||
|
var owner = coroutine.m_Owner.Target as EditorWindow;
|
||||||
|
|
||||||
|
if (owner == null || owner != null && owner != window)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("The EditorCoroutine is owned by another object: {0}.", coroutine.m_Owner.Target);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorCoroutineUtility.StopCoroutine(coroutine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 64c15e0c4e36aa84193d4acb3c63afc5
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b78ffde782257054289c22201b6bbc87
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,69 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 37e44dd86f563cf40a81ef1fdf1f1b54
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
: Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Standalone: Linux64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
- first:
|
||||||
|
Standalone: OSXUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86
|
||||||
|
- first:
|
||||||
|
Standalone: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86_64
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,69 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7d7e4808a93371242b38476718f4d4cc
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
: Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Standalone: Linux64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
- first:
|
||||||
|
Standalone: OSXUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86
|
||||||
|
- first:
|
||||||
|
Standalone: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86_64
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,43 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ed466bfa2ad216b41acde183e7706352
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
: Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
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,43 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e70477d38c7ca2841971b35549d1477f
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
: Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
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,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: aaca88d50145a3041a4ccab964c5793d
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6d55f65d499dd354a9c086ab6420c8f1
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dfd80cce2d0a99b4ba669e989eceafe5
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4adc17866ec41ac4e9ce6c47070aeef5
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ca15dd8e239d5d6468333cbdacbb55d2
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,43 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3ff40589a33e8a2458503b2391a96a83
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
: Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
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,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 94a257e1b1239d94589fe96db62b03a7
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 849ce1048cc324a46b0fe21149770a3f
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,43 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dd39e32872afc47418c75a05b559debf
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
: Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
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,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 582b34ab8eec62a4c87693272b9bc6ab
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 1
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
181
Packages/com.merry-yellow.code-assist/Editor/FeedbackWindow.cs
Normal file
181
Packages/com.merry-yellow.code-assist/Editor/FeedbackWindow.cs
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
public class FeedbackWindow : EditorWindow
|
||||||
|
{
|
||||||
|
|
||||||
|
GUIStyle? styleLabel;
|
||||||
|
|
||||||
|
public static void Display()
|
||||||
|
{
|
||||||
|
MQTTnetInitializer.Publisher?.SendRequestInternalLog();
|
||||||
|
|
||||||
|
// Get existing open window or if none, make a new one:
|
||||||
|
var window = GetWindow<FeedbackWindow>();
|
||||||
|
window.Show();
|
||||||
|
|
||||||
|
Serilog.Log.Debug("Displaying feedback window");
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendAnalyticsEvent("Gui", "FeedbackWindow_Display");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
//**--icon
|
||||||
|
//var icon = AssetDatabase.LoadAssetAtPath<Texture>("Assets/Sprites/Gear.png");
|
||||||
|
//titleContent = new GUIContent("Code Assist", icon);
|
||||||
|
titleContent = new GUIContent("Code Assist Feedback");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnGUI()
|
||||||
|
{
|
||||||
|
var errorCount = Logger.ELogger.GetErrorCountInInternalLog();
|
||||||
|
var warningCount = Logger.ELogger.GetWarningCountInInternalLog();
|
||||||
|
var logContent = Logger.ELogger.GetInternalLogContent();
|
||||||
|
if (!string.IsNullOrEmpty(Logger.ELogger.VsInternalLog))
|
||||||
|
logContent += Logger.ELogger.VsInternalLog;
|
||||||
|
|
||||||
|
styleLabel ??= new GUIStyle(GUI.skin.label)
|
||||||
|
{
|
||||||
|
wordWrap = true,
|
||||||
|
alignment = TextAnchor.MiddleCenter,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (errorCount > 0)
|
||||||
|
EditorGUILayout.LabelField($"{errorCount} error(s) found in logs. Please submit a feedback (via e-mail, Discord or GitHub) with the logs if possible.", styleLabel, GUILayout.ExpandWidth(true));
|
||||||
|
else if (warningCount > 0)
|
||||||
|
EditorGUILayout.LabelField($"{warningCount} warnings(s) found in logs. Please submit a feedback (via e-mail, Discord or GitHub) with the logs if possible.", styleLabel, GUILayout.ExpandWidth(true));
|
||||||
|
else
|
||||||
|
EditorGUILayout.LabelField("No errors found in logs. Please submit a feedback (via e-mail, Discord or GitHub) describing what went wrong or unexpected.", styleLabel, GUILayout.ExpandWidth(true));
|
||||||
|
|
||||||
|
if (GUILayout.Button("Send e-mail"))
|
||||||
|
{
|
||||||
|
var uri = "mailto:merryyellow@outlook.com";
|
||||||
|
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(uri));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("Send Discord message"))
|
||||||
|
{
|
||||||
|
//var uri = "discord://invites/2CgKHDq";
|
||||||
|
var uri = "https://discord.gg/2CgKHDq";
|
||||||
|
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(uri));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("Submit GitHub issue"))
|
||||||
|
{
|
||||||
|
var uri = "https://github.com/merryyellow/Unity-Code-Assist/issues/new/choose";
|
||||||
|
Application.OpenURL(uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorGUILayout.Separator();
|
||||||
|
|
||||||
|
if (GUILayout.Button("Open Unity full log"))
|
||||||
|
{
|
||||||
|
var filePath = Logger.ELogger.FilePath;
|
||||||
|
System.Diagnostics.Process.Start(filePath);
|
||||||
|
}
|
||||||
|
if (GUILayout.Button("Reveal Unity full log"))
|
||||||
|
{
|
||||||
|
var filePath = Logger.ELogger.FilePath;
|
||||||
|
ShowInFileExplorer(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("Open Visual Studio full log"))
|
||||||
|
{
|
||||||
|
var filePath = Logger.ELogger.VSFilePath;
|
||||||
|
System.Diagnostics.Process.Start(filePath);
|
||||||
|
}
|
||||||
|
if (GUILayout.Button("Reveal Visual Studio full log"))
|
||||||
|
{
|
||||||
|
var filePath = Logger.ELogger.VSFilePath;
|
||||||
|
ShowInFileExplorer(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("Copy recent logs to clipboard"))
|
||||||
|
{
|
||||||
|
GUIUtility.systemCopyBuffer = logContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorGUILayout.LabelField("Recent logs:", styleLabel, GUILayout.ExpandWidth(true));
|
||||||
|
EditorGUILayout.SelectableLabel(logContent, EditorStyles.textArea, GUILayout.ExpandHeight(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowInFileExplorer(string? filePath)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(filePath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("Argument {Arg} is null or empty at {Location}", nameof(filePath), nameof(ShowInFileExplorer));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
filePath = System.IO.Path.GetFullPath(filePath);
|
||||||
|
|
||||||
|
if (!System.IO.File.Exists(filePath) && !System.IO.Directory.Exists(filePath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("Argument {Arg} is not found at {Location}, value: {Value}", nameof(filePath), nameof(ShowInFileExplorer), filePath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows))
|
||||||
|
{
|
||||||
|
// Windows: highlight the file in Explorer
|
||||||
|
System.Diagnostics.Process.Start("explorer.exe", $"/select,\"{filePath}\"");
|
||||||
|
}
|
||||||
|
else if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.OSX))
|
||||||
|
{
|
||||||
|
// macOS: reveal in Finder
|
||||||
|
System.Diagnostics.Process.Start("open", $"-R \"{filePath}\"");
|
||||||
|
}
|
||||||
|
else if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Linux))
|
||||||
|
{
|
||||||
|
// Linux: open containing folder in a common file manager
|
||||||
|
string? directory = System.IO.Path.GetDirectoryName(filePath);
|
||||||
|
if (directory == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
string[] managers = { "xdg-open", "nautilus", "dolphin", "nemo", "thunar" };
|
||||||
|
|
||||||
|
foreach (string manager in managers)
|
||||||
|
{
|
||||||
|
if (TryStart(manager, directory))
|
||||||
|
return; // success
|
||||||
|
}
|
||||||
|
|
||||||
|
Serilog.Log.Error("No supported file manager found to open the directory at {Location}", nameof(ShowInFileExplorer));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("Unsupported OS platform at {Location}", nameof(ShowInFileExplorer));
|
||||||
|
}
|
||||||
|
|
||||||
|
// static local function for cleaner structure
|
||||||
|
static bool TryStart(string command, string args)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
System.Diagnostics.Process.Start(command, $"\"{args}\"");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2f84a1c080c184e48920a0124c3e9257
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Packages/com.merry-yellow.code-assist/Editor/Input.meta
Normal file
8
Packages/com.merry-yellow.code-assist/Editor/Input.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d6c9c2845abd74441a1c5d533408b33d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
//namespace UTJ.UnityCommandLineTools
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.Input
|
||||||
|
{
|
||||||
|
// <summary>
|
||||||
|
// bin2textをUnityEditorから実行する為のClass
|
||||||
|
// programed by Katsumasa.Kimura
|
||||||
|
// </summary>
|
||||||
|
public class Binary2TextExec : EditorToolExec
|
||||||
|
{
|
||||||
|
public Binary2TextExec() : base("binary2text") { }
|
||||||
|
|
||||||
|
// <summary>
|
||||||
|
// bin2text filePath outPath options
|
||||||
|
// /summary>
|
||||||
|
public int Exec(string filePath, string outPath, string options)
|
||||||
|
{
|
||||||
|
var args = string.Format(@"""{0}"" ""{1}"" {2}", filePath, outPath, options);
|
||||||
|
return Exec(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Exec(string filePath, string outPath, bool detailed = false, bool largeBinaryHashOnly = false, bool hexFloat = false)
|
||||||
|
{
|
||||||
|
//var args = string.Format(@"""{0}"" ""{1}"" {2}", filePath, outPath, options);
|
||||||
|
var args = string.Format(@"""{0}"" ""{1}""", filePath, outPath);
|
||||||
|
|
||||||
|
if (detailed)
|
||||||
|
args += " -detailed";
|
||||||
|
if (largeBinaryHashOnly)
|
||||||
|
args += " -largebinaryhashonly";
|
||||||
|
if (hexFloat)
|
||||||
|
args += " -hexfloat";
|
||||||
|
|
||||||
|
return Exec(args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <summary>
|
||||||
|
// UnityEditorに含まれるコマンドラインツールを実行する為の基底Class
|
||||||
|
// programed by Katsumasa.Kimura
|
||||||
|
//</summary>
|
||||||
|
public class EditorToolExec
|
||||||
|
{
|
||||||
|
// <value>
|
||||||
|
// UnityEditorがインストールされているディレクトリへのパス
|
||||||
|
// </value>
|
||||||
|
protected string mEditorPath;
|
||||||
|
|
||||||
|
// <value>
|
||||||
|
// Toolsディレクトリへのパス
|
||||||
|
// </value>
|
||||||
|
protected string mToolsPath;
|
||||||
|
|
||||||
|
// <value>
|
||||||
|
// 実行ファイル名
|
||||||
|
// </value>
|
||||||
|
protected string mExecFname;
|
||||||
|
|
||||||
|
// <value>
|
||||||
|
// 実行ファイルへのフルパス
|
||||||
|
// </value>
|
||||||
|
protected string mExecFullPath;
|
||||||
|
|
||||||
|
// <value>
|
||||||
|
// 実行結果のOUTPUT
|
||||||
|
// </value>
|
||||||
|
private string? mOutput;
|
||||||
|
|
||||||
|
// <value>
|
||||||
|
// 実行結果のOUTPUT
|
||||||
|
// </value>
|
||||||
|
public string? Output
|
||||||
|
{
|
||||||
|
get { return mOutput; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// <summary>
|
||||||
|
// コンストラクタ
|
||||||
|
// <param>
|
||||||
|
// mExecFname : 実行ファイル名
|
||||||
|
// </param>
|
||||||
|
// /summary>
|
||||||
|
public EditorToolExec(string mExecFname)
|
||||||
|
{
|
||||||
|
mEditorPath = Path.GetDirectoryName(EditorApplication.applicationPath);
|
||||||
|
mToolsPath = Path.Combine(mEditorPath, @"Data/Tools");
|
||||||
|
this.mExecFname = mExecFname;
|
||||||
|
//var files = Directory.GetFiles(mToolsPath, mExecFname, SearchOption.AllDirectories);
|
||||||
|
var files = Directory.GetFiles(mEditorPath, mExecFname + "*", SearchOption.AllDirectories);
|
||||||
|
|
||||||
|
if (files.Length == 0)
|
||||||
|
Serilog.Log.Error("{App} app couldn't be found at {Path}", mExecFname, mEditorPath);
|
||||||
|
|
||||||
|
mExecFullPath = files[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// <summary>
|
||||||
|
// コマンドラインツールを実行する
|
||||||
|
// <param>
|
||||||
|
// arg : コマンドラインツールに渡す引数
|
||||||
|
// </param>
|
||||||
|
// </summary>
|
||||||
|
public int Exec(string arg)
|
||||||
|
{
|
||||||
|
int exitCode = -1;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var process = new Process();
|
||||||
|
process.StartInfo.FileName = mExecFullPath;
|
||||||
|
process.StartInfo.Arguments = arg;
|
||||||
|
process.StartInfo.UseShellExecute = false;
|
||||||
|
process.StartInfo.RedirectStandardOutput = true;
|
||||||
|
process.StartInfo.CreateNoWindow = true;
|
||||||
|
process.Start();
|
||||||
|
mOutput = process.StandardOutput.ReadToEnd();
|
||||||
|
process.WaitForExit();
|
||||||
|
exitCode = process.ExitCode;
|
||||||
|
process.Close();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
//UnityEngine.Debug.Log(e);
|
||||||
|
Serilog.Log.Error(e, "Exception while running process at {Scope}.{Location}", nameof(EditorToolExec), nameof(Exec));
|
||||||
|
}
|
||||||
|
|
||||||
|
return exitCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 13d464c749e33e043b94d94c82365823
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.Input
|
||||||
|
{
|
||||||
|
|
||||||
|
public class InputManagerMonitor
|
||||||
|
{
|
||||||
|
private static readonly Lazy<InputManagerMonitor> _instance = new Lazy<InputManagerMonitor>(() => new InputManagerMonitor());
|
||||||
|
public static InputManagerMonitor Instance => _instance.Value;
|
||||||
|
|
||||||
|
//UnityInputManager inputManager;
|
||||||
|
readonly string inputManagerFilePath;
|
||||||
|
DateTime previousTagManagerLastWrite;
|
||||||
|
|
||||||
|
public InputManagerMonitor()
|
||||||
|
{
|
||||||
|
EditorApplication.update += Update;
|
||||||
|
inputManagerFilePath = CommonTools.GetInputManagerFilePath();
|
||||||
|
|
||||||
|
if (!System.IO.File.Exists(inputManagerFilePath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("InputManager file not found at {location}", inputManagerFilePath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
previousTagManagerLastWrite = System.IO.File.GetLastWriteTime(inputManagerFilePath);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug(ex, "Exception at {Location}", nameof(System.IO.File.GetLastWriteTime));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
#if !ENABLE_LEGACY_INPUT_MANAGER
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma warning disable CS0162
|
||||||
|
#pragma warning disable IDE0035
|
||||||
|
|
||||||
|
var currentInputManagerLastWrite = previousTagManagerLastWrite;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists(inputManagerFilePath))
|
||||||
|
currentInputManagerLastWrite = System.IO.File.GetLastWriteTime(inputManagerFilePath);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug(ex, "Exception at {Location}", nameof(System.IO.File.GetLastWriteTime));
|
||||||
|
}
|
||||||
|
if (currentInputManagerLastWrite != previousTagManagerLastWrite)
|
||||||
|
{
|
||||||
|
previousTagManagerLastWrite = currentInputManagerLastWrite;
|
||||||
|
Bump();
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore CS0162
|
||||||
|
#pragma warning restore IDE0035
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Bump()
|
||||||
|
{
|
||||||
|
#if !ENABLE_LEGACY_INPUT_MANAGER
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
#pragma warning disable CS0162
|
||||||
|
#pragma warning disable IDE0035
|
||||||
|
|
||||||
|
Serilog.Log.Debug("InputMonitor {Event}", nameof(Bump));
|
||||||
|
|
||||||
|
if (!System.IO.File.Exists(inputManagerFilePath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("InputManager file not found at {location}", inputManagerFilePath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var inputManager = new UnityInputManager();
|
||||||
|
inputManager.ReadFromPath(inputManagerFilePath);
|
||||||
|
inputManager.SendData();
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning restore CS0162
|
||||||
|
#pragma warning restore IDE0035
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static partial class Extensions
|
||||||
|
{
|
||||||
|
public static string GetInfo(this List<InputAxis> axes, string? name)
|
||||||
|
{
|
||||||
|
if (name == null || string.IsNullOrEmpty(name))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
//axis.descriptiveName
|
||||||
|
var axesWithName = axes.Where(a => a.Name == name);
|
||||||
|
|
||||||
|
int threshold = 80;
|
||||||
|
|
||||||
|
var sb = new System.Text.StringBuilder();
|
||||||
|
|
||||||
|
foreach (var axis in axesWithName)
|
||||||
|
if (!string.IsNullOrEmpty(axis.descriptiveName))
|
||||||
|
sb.Append($"{axis.descriptiveName} ");
|
||||||
|
|
||||||
|
if (sb.Length > threshold)
|
||||||
|
return sb.ToString();
|
||||||
|
|
||||||
|
foreach (var axis in axesWithName)
|
||||||
|
if (!string.IsNullOrEmpty(axis.descriptiveNegativeName))
|
||||||
|
sb.Append($"{axis.descriptiveNegativeName} ");
|
||||||
|
|
||||||
|
if (sb.Length > threshold)
|
||||||
|
return sb.ToString();
|
||||||
|
|
||||||
|
foreach (var axis in axesWithName)
|
||||||
|
if (!string.IsNullOrEmpty(axis.positiveButton))
|
||||||
|
sb.Append($"[{axis.positiveButton}] ");
|
||||||
|
|
||||||
|
if (sb.Length > threshold)
|
||||||
|
return sb.ToString();
|
||||||
|
|
||||||
|
foreach (var axis in axesWithName)
|
||||||
|
if (!string.IsNullOrEmpty(axis.altPositiveButton))
|
||||||
|
sb.Append($"{{{axis.altPositiveButton}}} ");
|
||||||
|
|
||||||
|
if (sb.Length > threshold)
|
||||||
|
return sb.ToString();
|
||||||
|
|
||||||
|
foreach (var axis in axesWithName)
|
||||||
|
if (!string.IsNullOrEmpty(axis.negativeButton))
|
||||||
|
sb.Append($"-[{axis.negativeButton}] ");
|
||||||
|
|
||||||
|
if (sb.Length > threshold)
|
||||||
|
return sb.ToString();
|
||||||
|
|
||||||
|
foreach (var axis in axesWithName)
|
||||||
|
if (!string.IsNullOrEmpty(axis.altNegativeButton))
|
||||||
|
sb.Append($"-{{{axis.altNegativeButton}}} ");
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e9c9772cbc184d74dbdb770fec5ff76c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
215
Packages/com.merry-yellow.code-assist/Editor/Input/Text2Yaml.cs
Normal file
215
Packages/com.merry-yellow.code-assist/Editor/Input/Text2Yaml.cs
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.Input
|
||||||
|
{
|
||||||
|
|
||||||
|
public class Text2Yaml
|
||||||
|
{
|
||||||
|
public static string Convert(IEnumerable<string> textLines)
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
var stack = new Stack<(string typeName, string identifier, int indentation)>();
|
||||||
|
|
||||||
|
sb.AppendLine(@"%YAML 1.1");
|
||||||
|
sb.AppendLine(@"%TAG !u! tag:unity3d.com,2011:");
|
||||||
|
sb.AppendLine(@"--- !u!13 &1");
|
||||||
|
sb.AppendLine(@"InputManager:");
|
||||||
|
|
||||||
|
var regexIndentation = new Regex("^\\s*");
|
||||||
|
|
||||||
|
var regexString = new Regex("^(\\s+)(\\w+)\\s+\"([a-zA-Z0-9_ \\/\\.\\-]*)\"\\s+\\(string\\)$");
|
||||||
|
var regexValue = new Regex("^(\\s+)(\\w+)\\s+(-?[0-9.]*)\\s+\\(((bool)|(int)|(float)|(unsigned int))\\)$");
|
||||||
|
var regexType = new Regex("^(\\s+)(\\w+)\\s+\\((\\w+)\\)$");
|
||||||
|
|
||||||
|
var regexVectorSize = new Regex("(\\s+)size\\s+(\\d)+\\s+\\(int\\)");
|
||||||
|
//var regexVectorData = new Regex("(\\s+)data \\(InputAxis\\)"); // remove InputAxis to make it more generic
|
||||||
|
|
||||||
|
string curTextLine;
|
||||||
|
var curTextLineNo = 3;
|
||||||
|
var textIndentation = 1;
|
||||||
|
var indentationPrefix = new string(' ', textIndentation * 2);
|
||||||
|
stack.Push(("InputManager", "InputManager", textIndentation));
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var line in textLines.Skip(4))
|
||||||
|
{
|
||||||
|
curTextLine = line;
|
||||||
|
curTextLineNo++;
|
||||||
|
|
||||||
|
|
||||||
|
// Skip empty lines
|
||||||
|
if (line.Length == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Check if type undeclared, scope goes down, indentation decrements
|
||||||
|
{
|
||||||
|
var indentationMatch = regexIndentation.Match(line);
|
||||||
|
if (indentationMatch.Success)
|
||||||
|
{
|
||||||
|
var indentation = indentationMatch.Groups[0].Value.Length;
|
||||||
|
|
||||||
|
if (indentation > textIndentation)
|
||||||
|
Error($"indentation({indentation}) > textIndentation({textIndentation})");
|
||||||
|
|
||||||
|
while (indentation < textIndentation)
|
||||||
|
{
|
||||||
|
stack.Pop();
|
||||||
|
textIndentation--;
|
||||||
|
var typeIndentation = textIndentation;
|
||||||
|
if (stack.TryPeek(out var curType2))
|
||||||
|
typeIndentation = curType2.indentation;
|
||||||
|
else if (line.Length > 0)
|
||||||
|
Error("stack empty at type undeclaration");
|
||||||
|
indentationPrefix = new string(' ', typeIndentation * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Error($"{nameof(regexIndentation)} failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip size field of vectors
|
||||||
|
if (stack.TryPeek(out var curType1) && curType1.typeName == "vector")
|
||||||
|
{
|
||||||
|
var vectorSizeMatch = regexVectorSize.Match(line);
|
||||||
|
if (vectorSizeMatch.Success)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read string fields
|
||||||
|
{
|
||||||
|
var stringMatch = regexString.Match(line);
|
||||||
|
if (stringMatch.Success)
|
||||||
|
{
|
||||||
|
AddLine(stringMatch.Groups[2] + ": " + stringMatch.Groups[3]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read bool/int/float/unsignedInt fields
|
||||||
|
{
|
||||||
|
var valueMatch = regexValue.Match(line);
|
||||||
|
if (valueMatch.Success)
|
||||||
|
{
|
||||||
|
AddLine(valueMatch.Groups[2] + ": " + valueMatch.Groups[3]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if new type declared, scope goes up, indentation increases
|
||||||
|
{
|
||||||
|
var typeMatch = regexType.Match(line);
|
||||||
|
if (typeMatch.Success)
|
||||||
|
{
|
||||||
|
var identifier = typeMatch.Groups[2].Value;
|
||||||
|
var typeName = typeMatch.Groups[3].Value;
|
||||||
|
|
||||||
|
var isVectorData = false;
|
||||||
|
if (stack.TryPeek(out var curType2) && curType2.typeName == "vector" && identifier == "data")
|
||||||
|
isVectorData = true;
|
||||||
|
|
||||||
|
var typeIndentation = textIndentation;
|
||||||
|
if (stack.TryPeek(out var curType3))
|
||||||
|
typeIndentation = curType3.indentation;
|
||||||
|
else if (line.Length > 0)
|
||||||
|
Error("stack empty at type declaration");
|
||||||
|
|
||||||
|
if (!isVectorData)
|
||||||
|
{
|
||||||
|
AddLine(typeMatch.Groups[2] + ":");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var customIndentation = typeIndentation - 1;
|
||||||
|
if (customIndentation < 0)
|
||||||
|
Error($"customIndentation({customIndentation}) < 0");
|
||||||
|
var customIndentationPrefix = new string(' ', customIndentation * 2);
|
||||||
|
AddLine("- serializedVersion: 3", customIndentationPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
textIndentation++;
|
||||||
|
typeIndentation++;
|
||||||
|
|
||||||
|
if (isVectorData)
|
||||||
|
typeIndentation--;
|
||||||
|
|
||||||
|
stack.Push((typeName, identifier, typeIndentation));
|
||||||
|
indentationPrefix = new string(' ', typeIndentation * 2);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Error("line failed to match all cases");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
|
||||||
|
|
||||||
|
void AddLine(string line, string? customIndentationPrefix = null)
|
||||||
|
{
|
||||||
|
string suffix;
|
||||||
|
if (stack.TryPeek(out var top))
|
||||||
|
suffix = $" # {textIndentation}, {top.indentation}, {top.typeName} {top.identifier}";
|
||||||
|
else
|
||||||
|
suffix = $" # {textIndentation}, nil";
|
||||||
|
|
||||||
|
if (customIndentationPrefix != null)
|
||||||
|
sb.AppendLine(customIndentationPrefix + line + suffix);
|
||||||
|
else
|
||||||
|
sb.AppendLine(indentationPrefix + line + suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Error(string message)
|
||||||
|
{
|
||||||
|
var errorMessage = $"Text2Yaml error '{message}' at lineNo: {curTextLineNo}, line: '{curTextLine}' at {Environment.StackTrace}";
|
||||||
|
//throw new Exception(errorMessage);
|
||||||
|
Serilog.Log.Warning(errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static partial class Extensions
|
||||||
|
{
|
||||||
|
public static bool TryPeek<T>(this Stack<T> stack, /*[MaybeNullWhen(false)]*/ out T result)
|
||||||
|
{
|
||||||
|
if (stack.Count > 0)
|
||||||
|
{
|
||||||
|
result = stack.Peek();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = default!;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5e191fef871d30041a55c3c8af5aab43
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,429 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
using YamlDotNet = Meryel.UnityCodeAssist.YamlDotNet;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.Input
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
internal class UnityInputManager
|
||||||
|
{
|
||||||
|
//string yamlPath;
|
||||||
|
TextReader? reader;
|
||||||
|
InputManager? inputManager;
|
||||||
|
|
||||||
|
public void ReadFromText(string text)
|
||||||
|
{
|
||||||
|
reader = new StringReader(text);
|
||||||
|
ReadAux(false, out _);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReadFromPath(string yamlPath)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (UnityEditor.EditorSettings.serializationMode)
|
||||||
|
{
|
||||||
|
case UnityEditor.SerializationMode.ForceText:
|
||||||
|
{
|
||||||
|
reader = new StreamReader(yamlPath);
|
||||||
|
ReadAux(false, out _);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UnityEditor.SerializationMode.ForceBinary:
|
||||||
|
{
|
||||||
|
// this approach will work for InputManager since its file size is small and limited
|
||||||
|
// but in the future, we may need to switch to reading binary files for big files
|
||||||
|
// like this https://github.com/Unity-Technologies/UnityDataTools
|
||||||
|
// or this https://github.com/SeriousCache/UABE
|
||||||
|
var converted = GetOrCreateConvertedFile(yamlPath);
|
||||||
|
if (!File.Exists(converted))
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Temp file {TempFile} couldn't found for converted yaml input file. Auto Input Manager will not work!", converted);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var rawLines = File.ReadLines(converted);
|
||||||
|
var yamlText = Text2Yaml.Convert(rawLines);
|
||||||
|
reader = new StringReader(yamlText);
|
||||||
|
ReadAux(false, out _);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UnityEditor.SerializationMode.Mixed:
|
||||||
|
{
|
||||||
|
reader = new StreamReader(yamlPath);
|
||||||
|
ReadAux(true, out var hasSemanticError);
|
||||||
|
if (hasSemanticError)
|
||||||
|
{
|
||||||
|
var converted = GetOrCreateConvertedFile(yamlPath);
|
||||||
|
if (!File.Exists(converted))
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Temp file {TempFile} couldn't found for converted yaml input file. Auto Input Manager will not work!", converted);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var rawLines = File.ReadLines(converted);
|
||||||
|
var yamlText = Text2Yaml.Convert(rawLines);
|
||||||
|
reader = new StringReader(yamlText);
|
||||||
|
ReadAux(false, out _);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ReadAux(bool canHaveSemanticError, out bool hasSemanticError)
|
||||||
|
{
|
||||||
|
hasSemanticError = false;
|
||||||
|
|
||||||
|
if (reader == null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning($"{nameof(UnityInputManager)}.{nameof(reader)} is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//var reader = new StreamReader(yamlPath);
|
||||||
|
var deserializer = new YamlDotNet.Serialization.DeserializerBuilder()
|
||||||
|
//.WithTagMapping("tag:unity3d.com,2011:13", typeof(Class13Mapper))
|
||||||
|
.WithNodeTypeResolver(new Tag13Resolver()) // some users have "tag:yousandi.cn,2023:13" instead, so use a more generic approach
|
||||||
|
.IgnoreUnmatchedProperties()
|
||||||
|
.Build();
|
||||||
|
//serializer.Settings.RegisterTagMapping("tag:unity3d.com,2011:13", typeof(Class13));
|
||||||
|
//serializer.Settings.ComparerForKeySorting = null;
|
||||||
|
Class13Mapper? result;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result = deserializer.Deserialize<Class13Mapper>(reader);
|
||||||
|
}
|
||||||
|
catch (YamlDotNet.Core.SemanticErrorException semanticErrorException)
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug(semanticErrorException, "Couldn't parse InputManager.asset yaml file");
|
||||||
|
if (!canHaveSemanticError)
|
||||||
|
Serilog.Log.Error(semanticErrorException, "Couldn't parse InputManager.asset yaml file unexpectedly");
|
||||||
|
|
||||||
|
hasSemanticError = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
reader.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
var inputManagerMapper = result?.InputManager;
|
||||||
|
if (inputManagerMapper == null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning($"{nameof(inputManagerMapper)} is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
inputManager = new InputManager(inputManagerMapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void SendData()
|
||||||
|
{
|
||||||
|
if (inputManager == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var axisNames = inputManager.Axes.Select(a => a.Name!).Where(n => !string.IsNullOrEmpty(n)).Distinct().ToArray();
|
||||||
|
var axisInfos = axisNames.Select(a => inputManager.Axes.GetInfo(a)).ToArray();
|
||||||
|
if (!CreateBindingsMap(out var buttonKeys, out var buttonAxis))
|
||||||
|
return;
|
||||||
|
|
||||||
|
string[] joystickNames;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
joystickNames = UnityEngine.Input.GetJoystickNames();
|
||||||
|
}
|
||||||
|
catch (InvalidOperationException)
|
||||||
|
{
|
||||||
|
// Occurs if user have switched active Input handling to Input System package in Player Settings.
|
||||||
|
joystickNames = new string[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
MQTTnetInitializer.Publisher?.SendInputManager(axisNames, axisInfos, buttonKeys, buttonAxis, joystickNames);
|
||||||
|
|
||||||
|
/*
|
||||||
|
MQTTnetInitializer.Publisher?.SendInputManager(
|
||||||
|
inputManager.Axes.Select(a => a.Name).Distinct().ToArray(),
|
||||||
|
inputManager.Axes.Select(a => a.positiveButton).ToArray(),
|
||||||
|
inputManager.Axes.Select(a => a.negativeButton).ToArray(),
|
||||||
|
inputManager.Axes.Select(a => a.altPositiveButton).ToArray(),
|
||||||
|
inputManager.Axes.Select(a => a.altNegativeButton).ToArray(),
|
||||||
|
UnityEngine.Input.GetJoystickNames()
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool CreateBindingsMap([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out string[]? inputKeys, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out string[]? inputAxis)
|
||||||
|
{
|
||||||
|
if (inputManager == null)
|
||||||
|
{
|
||||||
|
inputKeys = null;
|
||||||
|
inputAxis = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dict = new Dictionary<string, string?>();
|
||||||
|
|
||||||
|
foreach (var axis in inputManager.Axes)
|
||||||
|
{
|
||||||
|
if (axis.altNegativeButton != null && !string.IsNullOrEmpty(axis.altNegativeButton))
|
||||||
|
dict[axis.altNegativeButton] = axis.Name;
|
||||||
|
}
|
||||||
|
foreach (var axis in inputManager.Axes)
|
||||||
|
{
|
||||||
|
if (axis.negativeButton != null && !string.IsNullOrEmpty(axis.negativeButton))
|
||||||
|
dict[axis.negativeButton] = axis.Name;
|
||||||
|
}
|
||||||
|
foreach (var axis in inputManager.Axes)
|
||||||
|
{
|
||||||
|
if (axis.altPositiveButton != null && !string.IsNullOrEmpty(axis.altPositiveButton))
|
||||||
|
dict[axis.altPositiveButton] = axis.Name;
|
||||||
|
}
|
||||||
|
foreach (var axis in inputManager.Axes)
|
||||||
|
{
|
||||||
|
if (axis.positiveButton != null && !string.IsNullOrEmpty(axis.positiveButton))
|
||||||
|
dict[axis.positiveButton] = axis.Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
var keys = new string[dict.Count];
|
||||||
|
var values = new string[dict.Count];
|
||||||
|
dict.Keys.CopyTo(keys, 0);
|
||||||
|
dict.Values.CopyTo(values, 0);
|
||||||
|
|
||||||
|
inputKeys = keys;
|
||||||
|
inputAxis = values;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static string GetOrCreateConvertedFile(string filePath)
|
||||||
|
{
|
||||||
|
var hash = GetMD5Hash(filePath);
|
||||||
|
var convertedPath = Path.Combine(Path.GetTempPath(), $"UCA_IM_{hash}.txt");
|
||||||
|
|
||||||
|
if (!File.Exists(convertedPath))
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("Converting binary to text format of {File} to {Target}", filePath, convertedPath);
|
||||||
|
var converter = new Binary2TextExec();
|
||||||
|
converter.Exec(filePath, convertedPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("Converted file already exists at {Target}", convertedPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return convertedPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a hash of the file using MD5.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filePath"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetMD5Hash(string filePath)
|
||||||
|
{
|
||||||
|
using var md5 = new MD5CryptoServiceProvider();
|
||||||
|
return GetHash(filePath, md5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a hash of the file using MD5.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filePath"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetMD5Hash(Stream s)
|
||||||
|
{
|
||||||
|
using var md5 = new MD5CryptoServiceProvider();
|
||||||
|
return GetHash(s, md5);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetHash(string filePath, HashAlgorithm hasher)
|
||||||
|
{
|
||||||
|
using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||||
|
return GetHash(fs, hasher);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetHash(Stream s, HashAlgorithm hasher)
|
||||||
|
{
|
||||||
|
var hash = hasher.ComputeHash(s);
|
||||||
|
var hashStr = Convert.ToBase64String(hash);
|
||||||
|
//return hashStr.TrimEnd('=');
|
||||||
|
var hashStrAlphaNumeric = System.Text.RegularExpressions.Regex.Replace(hashStr, "[^A-Za-z0-9]", "");
|
||||||
|
return hashStrAlphaNumeric;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AxisType
|
||||||
|
{
|
||||||
|
KeyOrMouseButton = 0,
|
||||||
|
MouseMovement = 1,
|
||||||
|
JoystickAxis = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma warning disable IDE1006
|
||||||
|
|
||||||
|
public class InputAxisMapper
|
||||||
|
{
|
||||||
|
public int serializedVersion { get; set; }
|
||||||
|
|
||||||
|
public string? m_Name { get; set; }
|
||||||
|
public string? descriptiveName { get; set; }
|
||||||
|
public string? descriptiveNegativeName { get; set; }
|
||||||
|
public string? negativeButton { get; set; }
|
||||||
|
public string? positiveButton { get; set; }
|
||||||
|
public string? altNegativeButton { get; set; }
|
||||||
|
public string? altPositiveButton { get; set; }
|
||||||
|
|
||||||
|
//public float gravity { get; set; }
|
||||||
|
//public float dead { get; set; }
|
||||||
|
//public float sensitivity { get; set; }
|
||||||
|
public string? gravity { get; set; }
|
||||||
|
public string? dead { get; set; }
|
||||||
|
public string? sensitivity { get; set; }
|
||||||
|
|
||||||
|
//public bool snap { get; set; }
|
||||||
|
public int snap { get; set; }
|
||||||
|
//public bool invert { get; set; }
|
||||||
|
public int invert { get; set; }
|
||||||
|
|
||||||
|
//public AxisType type { get; set; }
|
||||||
|
public int type { get; set; }
|
||||||
|
|
||||||
|
public int axis { get; set; }
|
||||||
|
public int joyNum { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InputAxis
|
||||||
|
{
|
||||||
|
readonly InputAxisMapper map;
|
||||||
|
|
||||||
|
public InputAxis(InputAxisMapper map)
|
||||||
|
{
|
||||||
|
this.map = map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int SerializedVersion
|
||||||
|
{
|
||||||
|
get { return map.serializedVersion; }
|
||||||
|
set { map.serializedVersion = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public string? Name => map.m_Name;
|
||||||
|
public string? descriptiveName => map.descriptiveName;
|
||||||
|
public string? descriptiveNegativeName => map.descriptiveNegativeName;
|
||||||
|
public string? negativeButton => map.negativeButton;
|
||||||
|
public string? positiveButton => map.positiveButton;
|
||||||
|
public string? altNegativeButton => map.altNegativeButton;
|
||||||
|
public string? altPositiveButton => map.altPositiveButton;
|
||||||
|
|
||||||
|
public float gravity => float.Parse(map.gravity);//**--format
|
||||||
|
public float dead => float.Parse(map.dead);//**--format
|
||||||
|
public float sensitivity => float.Parse(map.sensitivity);//**--format
|
||||||
|
|
||||||
|
public bool snap => map.snap != 0;
|
||||||
|
public bool invert => map.invert != 0;
|
||||||
|
|
||||||
|
public AxisType type => (AxisType)map.type;
|
||||||
|
|
||||||
|
public int axis => map.axis;
|
||||||
|
public int joyNum => map.joyNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InputManagerMapper
|
||||||
|
{
|
||||||
|
public int m_ObjectHideFlags { get; set; }
|
||||||
|
public int serializedVersion { get; set; }
|
||||||
|
public int m_UsePhysicalKeys { get; set; }
|
||||||
|
public List<InputAxisMapper>? m_Axes { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore IDE1006
|
||||||
|
|
||||||
|
public class InputManager
|
||||||
|
{
|
||||||
|
readonly InputManagerMapper map;
|
||||||
|
readonly List<InputAxis> axes;
|
||||||
|
|
||||||
|
public InputManager(InputManagerMapper map)
|
||||||
|
{
|
||||||
|
this.map = map;
|
||||||
|
this.axes = new List<InputAxis>();
|
||||||
|
|
||||||
|
if (map.m_Axes == null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning($"map.m_Axes is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var a in map.m_Axes)
|
||||||
|
this.axes.Add(new InputAxis(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int ObjectHideFlags
|
||||||
|
{
|
||||||
|
get { return map.m_ObjectHideFlags; }
|
||||||
|
set { map.m_ObjectHideFlags = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int SerializedVersion
|
||||||
|
{
|
||||||
|
get { return map.serializedVersion; }
|
||||||
|
set { map.serializedVersion = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool UsePhysicalKeys
|
||||||
|
{
|
||||||
|
get { return map.m_UsePhysicalKeys != 0; }
|
||||||
|
set { map.m_UsePhysicalKeys = value ? 1 : 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*public List<InputAxisMapper> Axes
|
||||||
|
{
|
||||||
|
get { return map.m_Axes; }
|
||||||
|
set { map.m_Axes = value; }
|
||||||
|
}*/
|
||||||
|
public List<InputAxis> Axes => axes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Class13Mapper
|
||||||
|
{
|
||||||
|
public InputManagerMapper? InputManager { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Tag13Resolver : YamlDotNet.Serialization.INodeTypeResolver
|
||||||
|
{
|
||||||
|
public bool Resolve(YamlDotNet.Core.Events.NodeEvent? nodeEvent, ref Type currentType)
|
||||||
|
{
|
||||||
|
if (nodeEvent != null && !nodeEvent.Tag.IsEmpty && !nodeEvent.Tag.IsNonSpecific)
|
||||||
|
{
|
||||||
|
var tagValue = nodeEvent.Tag.Value;
|
||||||
|
if (tagValue.EndsWith(":13"))
|
||||||
|
{
|
||||||
|
currentType = typeof(Class13Mapper);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: abdf2bf92986f1d4f802bfedb8faf551
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
|
||||||
|
[InitializeOnLoad]
|
||||||
|
public static class LazyInitializer
|
||||||
|
{
|
||||||
|
static int counter;
|
||||||
|
|
||||||
|
static LazyInitializer()
|
||||||
|
{
|
||||||
|
counter = -5;// start initializing five frames later
|
||||||
|
EditorApplication.update += OnUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void OnUpdate()
|
||||||
|
{
|
||||||
|
counter++;
|
||||||
|
|
||||||
|
if (counter == 1)
|
||||||
|
MainThreadDispatcher.Bump();
|
||||||
|
else if (counter == 2)
|
||||||
|
Logger.ELogger.Bump();
|
||||||
|
else if (counter == 3)
|
||||||
|
Monitor.Bump();
|
||||||
|
else if (counter == 4)
|
||||||
|
MQTTnetInitializer.Bump();
|
||||||
|
else if (counter == 5)
|
||||||
|
Updater.CheckUpdateSilent();
|
||||||
|
else if (counter >= 6)
|
||||||
|
EditorApplication.update -= OnUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cc6e883c86567a34a94d52b99adf98bd
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Packages/com.merry-yellow.code-assist/Editor/Logger.meta
Normal file
8
Packages/com.merry-yellow.code-assist/Editor/Logger.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e49522b31aa92804b9f942ab013e436b
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using static System.IO.Path;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
public static class CommonTools
|
||||||
|
{
|
||||||
|
public static string GetScriptPath(string script)
|
||||||
|
{
|
||||||
|
var projectPath = GetProjectPathRaw();
|
||||||
|
var toolPath = Combine(projectPath, "Packages/com.merry-yellow.code-assist/Editor/", script);
|
||||||
|
return toolPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// does NOT include the trailing slash
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetExternalReferencesPath()
|
||||||
|
{
|
||||||
|
var projectPath = GetProjectPathRaw();
|
||||||
|
var extRefPath = Combine(projectPath, "Packages/com.merry-yellow.code-assist/Editor/ExternalReferences");
|
||||||
|
return extRefPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Obsolete]
|
||||||
|
public static string GetToolPath(string tool)
|
||||||
|
{
|
||||||
|
var projectPath = GetProjectPathRaw();
|
||||||
|
var toolPath = Combine(projectPath, "Packages/com.merry-yellow.code-assist/Tools~/", tool);
|
||||||
|
return toolPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetInstallerPath(string installer)
|
||||||
|
{
|
||||||
|
var projectPath = GetProjectPathRaw();
|
||||||
|
var installerPath = Combine(projectPath, "Packages/com.merry-yellow.code-assist/Installers~/", installer);
|
||||||
|
return installerPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetTagManagerFilePath()
|
||||||
|
{
|
||||||
|
var projectPath = GetProjectPathRaw();
|
||||||
|
var tagManagerPath = Combine(projectPath, "ProjectSettings/TagManager.asset");
|
||||||
|
return tagManagerPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetInputManagerFilePath()
|
||||||
|
{
|
||||||
|
var projectPath = GetProjectPathRaw();
|
||||||
|
var inputManagerPath = Combine(projectPath, "ProjectSettings/InputManager.asset");
|
||||||
|
return inputManagerPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetProjectPath()
|
||||||
|
{
|
||||||
|
var rawPath = GetProjectPathRaw();
|
||||||
|
//var pathWithoutWhiteSpace = rawPath.Trim(); // this is done in OSPath ctor
|
||||||
|
var osPath = new OSPath(rawPath);
|
||||||
|
var unixPath = osPath.Unix;
|
||||||
|
var trimmed = unixPath.TrimEnd('\\', '/');
|
||||||
|
var capitalized = FirstCharToUpper(trimmed); // this is required for TypeScript, so doing it here as well just in case
|
||||||
|
return capitalized!;
|
||||||
|
}
|
||||||
|
|
||||||
|
static string? FirstCharToUpper(string? input)
|
||||||
|
{
|
||||||
|
switch (input)
|
||||||
|
{
|
||||||
|
case null: return null;
|
||||||
|
case "": return "";
|
||||||
|
default: return input[0].ToString().ToUpper() + input.Substring(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the path to the project folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The project folder path</returns>
|
||||||
|
static string GetProjectPathRaw()
|
||||||
|
{
|
||||||
|
// Application.dataPath returns the path including /Assets, which we need to strip off
|
||||||
|
var path = UnityEngine.Application.dataPath;
|
||||||
|
var directory = new DirectoryInfo(path);
|
||||||
|
var parent = directory.Parent;
|
||||||
|
if (parent != null)
|
||||||
|
return parent.FullName;
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetHashForLogFile(string path) => Synchronizer.Model.Utilities.GetHashForLogFile(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/dmitrynogin/cdsf/blob/master/Cds.Folders/OSPath.cs
|
||||||
|
internal class OSPath
|
||||||
|
{
|
||||||
|
public static readonly OSPath Empty = "";
|
||||||
|
|
||||||
|
public static bool IsWindows => DirectorySeparatorChar == '\\';
|
||||||
|
|
||||||
|
public OSPath(string text)
|
||||||
|
{
|
||||||
|
Text = text.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator OSPath(string text) => new OSPath(text);
|
||||||
|
public static implicit operator string(OSPath path) => path.Normalized;
|
||||||
|
public override string ToString() => Normalized;
|
||||||
|
|
||||||
|
protected string Text { get; }
|
||||||
|
|
||||||
|
public string Normalized => IsWindows ? Windows : Unix;
|
||||||
|
public string Windows => Text.Replace('/', '\\');
|
||||||
|
//public string Unix => Simplified.Text.Replace('\\', '/');
|
||||||
|
public string Unix => Text.Replace('\\', '/');
|
||||||
|
|
||||||
|
public OSPath Relative => Simplified.Text.TrimStart('/', '\\');
|
||||||
|
public OSPath Absolute => IsAbsolute ? this : "/" + Relative;
|
||||||
|
|
||||||
|
public bool IsAbsolute => IsRooted || HasVolume;
|
||||||
|
public bool IsRooted => Text.Length >= 1 && (Text[0] == '/' || Text[0] == '\\');
|
||||||
|
public bool HasVolume => Text.Length >= 2 && Text[1] == ':';
|
||||||
|
public OSPath Simplified => HasVolume ? Text.Substring(2) : Text;
|
||||||
|
|
||||||
|
public OSPath Parent => GetDirectoryName(Text);
|
||||||
|
|
||||||
|
public bool Contains(OSPath path) =>
|
||||||
|
Normalized.StartsWith(path);
|
||||||
|
|
||||||
|
public static OSPath operator +(OSPath left, OSPath right) =>
|
||||||
|
new OSPath(Combine(left, right.Relative));
|
||||||
|
|
||||||
|
public static OSPath operator -(OSPath left, OSPath right) =>
|
||||||
|
left.Contains(right)
|
||||||
|
? new OSPath(left.Normalized.Substring(right.Normalized.Length)).Relative
|
||||||
|
: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9066c480a2fcb9940a432377a49262af
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
203
Packages/com.merry-yellow.code-assist/Editor/Logger/ELogger.cs
Normal file
203
Packages/com.merry-yellow.code-assist/Editor/Logger/ELogger.cs
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
//using Meryel.UnityCodeAssist.Serilog;
|
||||||
|
//using Meryel.UnityCodeAssist.Serilog.Core;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
#if ELOGGER
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.Logger
|
||||||
|
{
|
||||||
|
|
||||||
|
//[InitializeOnLoad]
|
||||||
|
public static class ELogger
|
||||||
|
{
|
||||||
|
public static event System.Action? OnVsInternalLogChanged;
|
||||||
|
|
||||||
|
|
||||||
|
// Change 'new LoggerConfiguration().MinimumLevel.Debug();' if you change these values
|
||||||
|
const Serilog.Events.LogEventLevel fileMinLevel = Serilog.Events.LogEventLevel.Debug;
|
||||||
|
const Serilog.Events.LogEventLevel outputWindowMinLevel = Serilog.Events.LogEventLevel.Information;
|
||||||
|
static LoggingLevelSwitch? fileLevelSwitch, outputWindowLevelSwitch;
|
||||||
|
|
||||||
|
//static bool IsInitialized { get; set; }
|
||||||
|
|
||||||
|
static ILogEventSink? _outputWindowSink;
|
||||||
|
static ILogEventSink? _memorySink;
|
||||||
|
|
||||||
|
|
||||||
|
public static string GetInternalLogContent() => _memorySink == null ? string.Empty : ((MemorySink)_memorySink).Export();
|
||||||
|
public static int GetErrorCountInInternalLog() => _memorySink == null ? 0 : ((MemorySink)_memorySink).ErrorCount;
|
||||||
|
public static int GetWarningCountInInternalLog() => _memorySink == null ? 0 : ((MemorySink)_memorySink).WarningCount;
|
||||||
|
|
||||||
|
public static string? FilePath { get; private set; }
|
||||||
|
public static string? VSFilePath { get; private set; }
|
||||||
|
|
||||||
|
//**-- make it work with multiple clients
|
||||||
|
static string? _vsInternalLog;
|
||||||
|
public static string? VsInternalLog
|
||||||
|
{
|
||||||
|
get => _vsInternalLog;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_vsInternalLog = value;
|
||||||
|
OnVsInternalLogChanged?.Invoke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static ELogger()
|
||||||
|
{
|
||||||
|
var isFirst = false;
|
||||||
|
const string stateName = "isFirst";
|
||||||
|
if (!SessionState.GetBool(stateName, false))
|
||||||
|
{
|
||||||
|
isFirst = true;
|
||||||
|
SessionState.SetBool(stateName, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
var projectPath = CommonTools.GetProjectPath();
|
||||||
|
var outputWindowSink = new System.Lazy<ILogEventSink>(() => new UnityOutputWindowSink(null));
|
||||||
|
|
||||||
|
Init(isFirst, projectPath, outputWindowSink);
|
||||||
|
|
||||||
|
if (isFirst)
|
||||||
|
LogHeader(Application.unityVersion, projectPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Empty method for invoking static class ctor
|
||||||
|
/// </summary>
|
||||||
|
public static void Bump() { }
|
||||||
|
|
||||||
|
|
||||||
|
static void LogHeader(string unityVersion, string solutionDir)
|
||||||
|
{
|
||||||
|
var os = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
|
||||||
|
var assisterVersion = Assister.Version;
|
||||||
|
var syncModel = Synchronizer.Model.Utilities.Version;
|
||||||
|
var hash = CommonTools.GetHashForLogFile(solutionDir);
|
||||||
|
var port = Synchronizer.Model.Utilities.GetPortForMQTTnet(solutionDir);
|
||||||
|
Serilog.Log.Debug(
|
||||||
|
"Beginning logging {OS}, Unity {U}, Unity Code Assist {A}, Communication Protocol {SM}, Project: '{Dir}', Project Hash: {Hash}, Port: {Port}",
|
||||||
|
os, unityVersion, assisterVersion, syncModel, solutionDir, hash, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static string GetFilePath(string solutionDir)
|
||||||
|
{
|
||||||
|
var solutionHash = CommonTools.GetHashForLogFile(solutionDir);
|
||||||
|
var tempDir = System.IO.Path.GetTempPath();
|
||||||
|
var fileName = $"UnityCodeAssist_U_Log_{solutionHash}_.TXT"; // hour code will be appended to the end of file, so add a trailing '_'
|
||||||
|
var filePath = System.IO.Path.Combine(tempDir, fileName);
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
static string GetVSFilePath(string solutionDir)
|
||||||
|
{
|
||||||
|
var solutionHash = CommonTools.GetHashForLogFile(solutionDir);
|
||||||
|
var tempDir = System.IO.Path.GetTempPath();
|
||||||
|
#if MERYEL_UCA_LITE_VERSION
|
||||||
|
var fileName = $"UnityCodeAssistLite_VS_Log_{solutionHash}_.TXT"; // hour code will be appended to the end of file, so add a trailing '_'
|
||||||
|
#else
|
||||||
|
var fileName = $"UnityCodeAssist_VS_Log_{solutionHash}_.TXT"; // hour code will be appended to the end of file, so add a trailing '_'
|
||||||
|
#endif
|
||||||
|
var filePath = System.IO.Path.Combine(tempDir, fileName);
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void Init(bool isFirst, string solutionDir, System.Lazy<ILogEventSink> outputWindowSink)
|
||||||
|
{
|
||||||
|
|
||||||
|
FilePath = GetFilePath(solutionDir);
|
||||||
|
VSFilePath = GetVSFilePath(solutionDir);
|
||||||
|
|
||||||
|
fileLevelSwitch = new LoggingLevelSwitch(fileMinLevel);
|
||||||
|
outputWindowLevelSwitch = new LoggingLevelSwitch(outputWindowMinLevel);
|
||||||
|
|
||||||
|
var config = new LoggerConfiguration()
|
||||||
|
.MinimumLevel.Debug()
|
||||||
|
.Enrich.With(new DomainHashEnricher());
|
||||||
|
|
||||||
|
const string outputTemplate = "{Timestamp:HH:mm:ss.fff} [U] [{Level:u3}] [{DomainHash}] {Message:lj}{NewLine}{Exception}";
|
||||||
|
|
||||||
|
config = config.WriteTo.PersistentFile(FilePath
|
||||||
|
, outputTemplate: outputTemplate
|
||||||
|
, shared: true
|
||||||
|
, persistentFileRollingInterval: PersistentFileRollingInterval.Day
|
||||||
|
, preserveLogFilename: true
|
||||||
|
, levelSwitch: fileLevelSwitch
|
||||||
|
, rollOnEachProcessRun: isFirst
|
||||||
|
);
|
||||||
|
|
||||||
|
_outputWindowSink ??= outputWindowSink.Value;
|
||||||
|
if (_outputWindowSink != null)
|
||||||
|
config = config.WriteTo.Sink(_outputWindowSink, outputWindowMinLevel, outputWindowLevelSwitch);
|
||||||
|
|
||||||
|
_memorySink ??= new MemorySink(outputTemplate);
|
||||||
|
config = config.WriteTo.Sink(_memorySink, fileMinLevel, null);
|
||||||
|
|
||||||
|
config = config.Destructure.With(new MyDestructuringPolicy());
|
||||||
|
|
||||||
|
Serilog.Log.Logger = config.CreateLogger();
|
||||||
|
//switchableLogger.Set(config.CreateLogger(), disposePrev: true);
|
||||||
|
|
||||||
|
OnOptionsChanged();
|
||||||
|
|
||||||
|
//IsInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnOptionsChanged()
|
||||||
|
{
|
||||||
|
// Since we don't use LogEventLevel.Fatal, we can use it for disabling sinks
|
||||||
|
|
||||||
|
var isLoggingToFile = OptionsIsLoggingToFile;
|
||||||
|
var targetFileLevel = isLoggingToFile ? fileMinLevel : Serilog.Events.LogEventLevel.Fatal;
|
||||||
|
if (fileLevelSwitch != null)
|
||||||
|
fileLevelSwitch.MinimumLevel = targetFileLevel;
|
||||||
|
|
||||||
|
var isLoggingToOutputWindow = OptionsIsLoggingToOutputWindow;
|
||||||
|
var targetOutputWindowLevel = isLoggingToOutputWindow ? outputWindowMinLevel : Serilog.Events.LogEventLevel.Fatal;
|
||||||
|
if (outputWindowLevelSwitch != null)
|
||||||
|
outputWindowLevelSwitch.MinimumLevel = targetOutputWindowLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
//**-- UI for these two
|
||||||
|
static bool OptionsIsLoggingToFile => true;
|
||||||
|
static bool OptionsIsLoggingToOutputWindow => true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MyDestructuringPolicy : IDestructuringPolicy
|
||||||
|
{
|
||||||
|
// serilog cannot destruct StringArrayContainer by default, so do it manually
|
||||||
|
public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Serilog.Events.LogEventPropertyValue? result)
|
||||||
|
{
|
||||||
|
if (value is Synchronizer.Model.StringArrayContainer sac)
|
||||||
|
{
|
||||||
|
var items = sac.Container.Select(item => propertyValueFactory.CreatePropertyValue(item, true));
|
||||||
|
result = new Serilog.Events.SequenceValue(items);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ca3b9ef056f0ba843936ff335d12b0a9
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
//using Meryel.UnityCodeAssist.Serilog;
|
||||||
|
//using Meryel.UnityCodeAssist.Serilog.Core;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
using Meryel.Serilog;
|
||||||
|
using Meryel.Serilog.Core;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.Logger
|
||||||
|
{
|
||||||
|
|
||||||
|
//[InitializeOnLoad]
|
||||||
|
public static class ELogger
|
||||||
|
{
|
||||||
|
public static event System.Action? OnVsInternalLogChanged;
|
||||||
|
|
||||||
|
|
||||||
|
// Change 'new LoggerConfiguration().MinimumLevel.Debug();' if you change these values
|
||||||
|
const Serilog.Events.LogEventLevel fileMinLevel = Serilog.Events.LogEventLevel.Debug;
|
||||||
|
const Serilog.Events.LogEventLevel outputWindowMinLevel = Serilog.Events.LogEventLevel.Information;
|
||||||
|
static LoggingLevelSwitch? fileLevelSwitch, outputWindowLevelSwitch;
|
||||||
|
|
||||||
|
//static bool IsInitialized { get; set; }
|
||||||
|
|
||||||
|
static ILogEventSink? _outputWindowSink;
|
||||||
|
static ILogEventSink? _memorySink;
|
||||||
|
|
||||||
|
|
||||||
|
public static string GetInternalLogContent() => _memorySink == null ? string.Empty : ((Meryel.UnityCodeAssist.Logger.MemorySink)_memorySink).Export();
|
||||||
|
public static int GetErrorCountInInternalLog() => _memorySink == null ? 0 : ((Meryel.UnityCodeAssist.Logger.MemorySink)_memorySink).ErrorCount;
|
||||||
|
public static int GetWarningCountInInternalLog() => _memorySink == null ? 0 : ((Meryel.UnityCodeAssist.Logger.MemorySink)_memorySink).WarningCount;
|
||||||
|
|
||||||
|
public static string? FilePath => Meryel.UnityCodeAssist.Logger.ELogger.UnityFilePath;
|
||||||
|
public static string? VSFilePath => Meryel.UnityCodeAssist.Logger.ELogger.VisualStudioFilePath;
|
||||||
|
|
||||||
|
//**-- make it work with multiple clients
|
||||||
|
static string? _vsInternalLog;
|
||||||
|
public static string? VsInternalLog
|
||||||
|
{
|
||||||
|
get => _vsInternalLog;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_vsInternalLog = value;
|
||||||
|
OnVsInternalLogChanged?.Invoke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static ELogger()
|
||||||
|
{
|
||||||
|
fileLevelSwitch = null;
|
||||||
|
outputWindowLevelSwitch = null;
|
||||||
|
_memorySink = null;
|
||||||
|
|
||||||
|
var isFirst = false;
|
||||||
|
const string stateName = "isFirst";
|
||||||
|
if (!SessionState.GetBool(stateName, false))
|
||||||
|
{
|
||||||
|
isFirst = true;
|
||||||
|
SessionState.SetBool(stateName, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
var projectPath = CommonTools.GetProjectPath();
|
||||||
|
var outputWindowSink = new System.Lazy<ILogEventSink>(() => new UnityOutputWindowSink(null));
|
||||||
|
|
||||||
|
Init(isFirst, projectPath, outputWindowSink);
|
||||||
|
|
||||||
|
if (isFirst)
|
||||||
|
LogHeader(Application.unityVersion, projectPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Empty method for invoking static class ctor
|
||||||
|
/// </summary>
|
||||||
|
public static void Bump() { }
|
||||||
|
|
||||||
|
|
||||||
|
static void LogHeader(string unityVersion, string solutionDir)
|
||||||
|
{
|
||||||
|
var os = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
|
||||||
|
var assisterVersion = Assister.Version;
|
||||||
|
var syncModel = Synchronizer.Model.Utilities.Version;
|
||||||
|
var hash = CommonTools.GetHashForLogFile(solutionDir);
|
||||||
|
var port = Synchronizer.Model.Utilities.GetPortForMQTTnet(solutionDir);
|
||||||
|
Serilog.Log.Debug(
|
||||||
|
"Beginning logging {OS}, Unity {U}, Unity Code Assist {A}, Communication Protocol {SM}, Project: '{Dir}', Project Hash: {Hash}, Port: {Port}",
|
||||||
|
os, unityVersion, assisterVersion, syncModel, solutionDir, hash, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void Init(bool isFirst, string solutionDir, System.Lazy<ILogEventSink> outputWindowSink)
|
||||||
|
{
|
||||||
|
//var solutionHash = Common.CommonTools.GetHashOfPath(solutionDir);
|
||||||
|
var solutionHash = CommonTools.GetHashForLogFile(solutionDir); // dir is osSafePath
|
||||||
|
_outputWindowSink ??= outputWindowSink.Value;
|
||||||
|
var sinkWrapper = new System.Lazy<Meryel.Serilog.Core.ILogEventSink>(() => _outputWindowSink);
|
||||||
|
|
||||||
|
Meryel.UnityCodeAssist.Logger.ELogger.Init(
|
||||||
|
UnityCodeAssist.Logger.ELogger.State.FullyInitialized,
|
||||||
|
UnityCodeAssist.Logger.ELogger.PackagePriority.High,
|
||||||
|
solutionDir, solutionHash, "UnityCodeAssist", ProjectData.Domain.Unity,
|
||||||
|
sinkWrapper, null, null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnOptionsChanged()
|
||||||
|
{
|
||||||
|
// Since we don't use LogEventLevel.Fatal, we can use it for disabling sinks
|
||||||
|
|
||||||
|
var isLoggingToFile = OptionsIsLoggingToFile;
|
||||||
|
var targetFileLevel = isLoggingToFile ? fileMinLevel : Serilog.Events.LogEventLevel.Fatal;
|
||||||
|
if (fileLevelSwitch != null)
|
||||||
|
fileLevelSwitch.MinimumLevel = targetFileLevel;
|
||||||
|
|
||||||
|
var isLoggingToOutputWindow = OptionsIsLoggingToOutputWindow;
|
||||||
|
var targetOutputWindowLevel = isLoggingToOutputWindow ? outputWindowMinLevel : Serilog.Events.LogEventLevel.Fatal;
|
||||||
|
if (outputWindowLevelSwitch != null)
|
||||||
|
outputWindowLevelSwitch.MinimumLevel = targetOutputWindowLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
//**-- UI for these two
|
||||||
|
static bool OptionsIsLoggingToFile => true;
|
||||||
|
static bool OptionsIsLoggingToOutputWindow => true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 44a33ba3272c55d4fad27588d4bdcb2a
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
//using Meryel.UnityCodeAssist.Serilog;
|
||||||
|
//using Meryel.UnityCodeAssist.Serilog.Core;
|
||||||
|
//using Meryel.UnityCodeAssist.Serilog.Events;
|
||||||
|
//using Meryel.UnityCodeAssist.Serilog.Configuration;
|
||||||
|
using Meryel.Serilog;
|
||||||
|
using Meryel.Serilog.Core;
|
||||||
|
using Meryel.Serilog.Events;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor.Logger
|
||||||
|
{
|
||||||
|
public class UnityOutputWindowSink : ILogEventSink
|
||||||
|
{
|
||||||
|
private readonly IFormatProvider? _formatProvider;
|
||||||
|
|
||||||
|
public UnityOutputWindowSink(IFormatProvider? formatProvider)
|
||||||
|
{
|
||||||
|
_formatProvider = formatProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Emit(LogEvent? logEvent)
|
||||||
|
{
|
||||||
|
if (logEvent == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var message = logEvent.RenderMessage(_formatProvider, false);
|
||||||
|
|
||||||
|
switch (logEvent.Level)
|
||||||
|
{
|
||||||
|
//case LogEventLevel.Verbose:
|
||||||
|
//case LogEventLevel.Debug:
|
||||||
|
case LogEventLevel.Information:
|
||||||
|
UnityEngine.Debug.Log(message);
|
||||||
|
break;
|
||||||
|
case LogEventLevel.Warning:
|
||||||
|
UnityEngine.Debug.LogWarning(message);
|
||||||
|
break;
|
||||||
|
case LogEventLevel.Error:
|
||||||
|
case LogEventLevel.Fatal:
|
||||||
|
UnityEngine.Debug.LogError(message);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f0cc7f1339aeef54898503bd5cdc51fc
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
using MQTTnet = Meryel.UnityCodeAssist.MQTTnet;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
//[InitializeOnLoad]
|
||||||
|
public static class MQTTnetInitializer
|
||||||
|
{
|
||||||
|
public static MQTTnetPublisher? Publisher;
|
||||||
|
|
||||||
|
static MQTTnetInitializer()
|
||||||
|
{
|
||||||
|
EditorApplication.quitting += EditorApplication_quitting;
|
||||||
|
AssemblyReloadEvents.beforeAssemblyReload += AssemblyReloadEvents_beforeAssemblyReload;
|
||||||
|
//AssemblyReloadEvents.afterAssemblyReload += AssemblyReloadEvents_afterAssemblyReload;
|
||||||
|
|
||||||
|
RunOnceOnUpdate(Initialize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Empty method for invoking static class ctor
|
||||||
|
/// </summary>
|
||||||
|
public static void Bump() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// false for profiler standalone process
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool IsMainUnityEditorProcess()
|
||||||
|
{
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
if (UnityEditor.AssetDatabase.IsAssetImportWorkerProcess())
|
||||||
|
return false;
|
||||||
|
#elif UNITY_2019_3_OR_NEWER
|
||||||
|
if (UnityEditor.Experimental.AssetDatabaseExperimental.IsAssetImportWorkerProcess())
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UNITY_2021_1_OR_NEWER
|
||||||
|
if (UnityEditor.MPE.ProcessService.level == UnityEditor.MPE.ProcessLevel.Secondary)
|
||||||
|
return false;
|
||||||
|
#elif UNITY_2020_2_OR_NEWER
|
||||||
|
if (UnityEditor.MPE.ProcessService.level == UnityEditor.MPE.ProcessLevel.Slave)
|
||||||
|
return false;
|
||||||
|
#elif UNITY_2020_1_OR_NEWER
|
||||||
|
if (global::Unity.MPE.ProcessService.level == global::Unity.MPE.ProcessLevel.UMP_SLAVE)
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Initialize()
|
||||||
|
{
|
||||||
|
if (!IsMainUnityEditorProcess())
|
||||||
|
{
|
||||||
|
// if try to creaate NetMQ, will recieve AddressAlreadyInUseException during binding
|
||||||
|
Serilog.Log.Debug("MQTTnet won't initialize on secondary processes");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serilog.Log.Debug("MQTTnet initializing");
|
||||||
|
|
||||||
|
//Serilog.Log.Debug("MQTTnet constructing");
|
||||||
|
Publisher = new MQTTnetPublisher();
|
||||||
|
|
||||||
|
RunOnShutdown(OnShutDown);
|
||||||
|
Serilog.Log.Debug("MQTTnet initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void OnShutDown()
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("MQTTnet OnShutDown");
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
//private static void AssemblyReloadEvents_afterAssemblyReload()
|
||||||
|
//{
|
||||||
|
// Serilog.Log.Debug("MQTTnet AssemblyReloadEvents_afterAssemblyReload");
|
||||||
|
//}
|
||||||
|
|
||||||
|
private static void AssemblyReloadEvents_beforeAssemblyReload()
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("MQTTnet AssemblyReloadEvents_beforeAssemblyReload");
|
||||||
|
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void EditorApplication_quitting()
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("MQTTnet EditorApplication_quitting");
|
||||||
|
|
||||||
|
Publisher?.SendDisconnect();
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Clear() => Publisher?.Clear();
|
||||||
|
|
||||||
|
|
||||||
|
private static void RunOnceOnUpdate(Action action)
|
||||||
|
{
|
||||||
|
void callback()
|
||||||
|
{
|
||||||
|
EditorApplication.update -= callback;
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorApplication.update += callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RunOnShutdown(Action action)
|
||||||
|
{
|
||||||
|
// Mono on OSX has all kinds of quirks on AppDomain shutdown
|
||||||
|
//if (!VisualStudioEditor.IsWindows)
|
||||||
|
//return;
|
||||||
|
#if !UNITY_EDITOR_WIN
|
||||||
|
return;
|
||||||
|
#else
|
||||||
|
AppDomain.CurrentDomain.DomainUnload += (_, __) => action();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6a503036d3d400042a5d9fdd5564202b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
926
Packages/com.merry-yellow.code-assist/Editor/MQTTnetPublisher.cs
Normal file
926
Packages/com.merry-yellow.code-assist/Editor/MQTTnetPublisher.cs
Normal file
@@ -0,0 +1,926 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using System.Threading;
|
||||||
|
using Task = System.Threading.Tasks.Task;
|
||||||
|
using Application = UnityEngine.Application;
|
||||||
|
|
||||||
|
using Meryel.UnityCodeAssist.MQTTnet;
|
||||||
|
using Meryel.UnityCodeAssist.MQTTnet.Server;
|
||||||
|
using Meryel.UnityCodeAssist.MQTTnet.Protocol;
|
||||||
|
using Meryel.UnityCodeAssist.MQTTnet.Adapter;
|
||||||
|
using Meryel.UnityCodeAssist.MQTTnet.Implementations;
|
||||||
|
using Meryel.UnityCodeAssist.MQTTnet.Diagnostics;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma warning disable IDE0005
|
||||||
|
using Serilog = Meryel.Serilog;
|
||||||
|
using MQTTnet = Meryel.UnityCodeAssist.MQTTnet;
|
||||||
|
using Newtonsoft = Meryel.UnityCodeAssist.Newtonsoft;
|
||||||
|
#pragma warning restore IDE0005
|
||||||
|
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
|
||||||
|
//**--
|
||||||
|
// can also do this for better clear, sometimes it gets locked
|
||||||
|
// https://answers.unity.com/questions/704066/callback-before-unity-reloads-editor-assemblies.html#
|
||||||
|
|
||||||
|
namespace Meryel.UnityCodeAssist.Editor
|
||||||
|
{
|
||||||
|
public class MQTTnetPublisher : Synchronizer.Model.IProcessor
|
||||||
|
{
|
||||||
|
MqttServer? broker;
|
||||||
|
|
||||||
|
CancellationTokenSource? cancellationTokenSource;
|
||||||
|
|
||||||
|
readonly Synchronizer.Model.Manager syncMngr;
|
||||||
|
|
||||||
|
//public readonly List<Synchronizer.Model.Connect> clients;
|
||||||
|
readonly System.Collections.Concurrent.ConcurrentDictionary<string, Synchronizer.Model.Connect> _clients;
|
||||||
|
|
||||||
|
public IEnumerable<Synchronizer.Model.Connect> Clients => _clients.Values.Where(c => c.NodeKind != Synchronizer.Model.NodeKind.SemiClient_RoslynAnalyzer.ToString());
|
||||||
|
|
||||||
|
Synchronizer.Model.Connect? _self;
|
||||||
|
|
||||||
|
Synchronizer.Model.Connect Self => _self!;
|
||||||
|
|
||||||
|
void InitializeSelf()
|
||||||
|
{
|
||||||
|
var projectPath = CommonTools.GetProjectPath();
|
||||||
|
_self = new Synchronizer.Model.Connect()
|
||||||
|
{
|
||||||
|
ModelVersion = Synchronizer.Model.Utilities.Version,
|
||||||
|
ProjectPath = projectPath,
|
||||||
|
ProjectName = getProjectName(),
|
||||||
|
ContactInfo = $"Unity {Application.unityVersion}",
|
||||||
|
AssemblyVersion = Assister.Version,
|
||||||
|
#if MERYEL_UCA_LITE_VERSION
|
||||||
|
LiteOrFull = "Lite",
|
||||||
|
#else
|
||||||
|
LiteOrFull = "Full",
|
||||||
|
#endif
|
||||||
|
NodeKind = Synchronizer.Model.NodeKind.Server.ToString(),
|
||||||
|
ClientId = "",
|
||||||
|
};
|
||||||
|
|
||||||
|
string getProjectName()
|
||||||
|
{
|
||||||
|
string[] s = projectPath.Split('/');
|
||||||
|
#pragma warning disable IDE0056
|
||||||
|
string projectName = s[s.Length - 1];
|
||||||
|
#pragma warning restore IDE0056
|
||||||
|
//Logg("project = " + projectName);
|
||||||
|
return projectName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void LogContext()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public MQTTnetPublisher()
|
||||||
|
{
|
||||||
|
// LogContext();
|
||||||
|
|
||||||
|
Serilog.Log.Debug("MQTTnet server initializing, begin");
|
||||||
|
|
||||||
|
InitializeSelf();
|
||||||
|
|
||||||
|
_clients = new System.Collections.Concurrent.ConcurrentDictionary<string, Synchronizer.Model.Connect>();
|
||||||
|
syncMngr = new Synchronizer.Model.Manager(this);
|
||||||
|
|
||||||
|
var port = Synchronizer.Model.Utilities.GetPortForMQTTnet(Self!.ProjectPath);
|
||||||
|
|
||||||
|
|
||||||
|
// Create the options for our MQTT Broker
|
||||||
|
MqttServerOptionsBuilder options = new MqttServerOptionsBuilder()
|
||||||
|
// set endpoint to localhost
|
||||||
|
.WithDefaultEndpoint()
|
||||||
|
// port used will be 707
|
||||||
|
.WithDefaultEndpointPort(port)
|
||||||
|
// handler for new connections
|
||||||
|
//.WithConnectionValidator(OnNewConnection)
|
||||||
|
// handler for new messages
|
||||||
|
//.WithApplicationMessageInterceptor(OnNewMessage)
|
||||||
|
|
||||||
|
// disable ipv6 for linux (and possibly macos too), otherwise socket exception is thrown
|
||||||
|
.WithDefaultEndpointBoundIPV6Address(System.Net.IPAddress.None)
|
||||||
|
|
||||||
|
// for preventing socket ex after server restart https://github.com/dotnet/MQTTnet/issues/494
|
||||||
|
// System.Net.Sockets.SocketException (0x80004005): Only one usage of each socket address (protocol/network address/port) is normally permitted.
|
||||||
|
.WithTlsEndpointReuseAddress()
|
||||||
|
;
|
||||||
|
|
||||||
|
IList<IMqttServerAdapter> DefaultServerAdapters = new List<IMqttServerAdapter>()
|
||||||
|
{
|
||||||
|
new MqttTcpServerAdapter(),
|
||||||
|
};
|
||||||
|
var logger = new MqttNetNullLogger();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
broker = new MqttServer(options.Build(), DefaultServerAdapters, logger);
|
||||||
|
|
||||||
|
broker.InterceptingPublishAsync += Broker_InterceptingPublishAsync;
|
||||||
|
broker.ClientDisconnectedAsync += Broker_ClientDisconnectedAsync;
|
||||||
|
|
||||||
|
Serilog.Log.Debug("MQTTnet server initializing, constructed broker, port: {Port}", port);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//broker.StartAsync().GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
var startTask = Task.Run(() => broker.StartAsync());
|
||||||
|
if (!startTask.Wait(TimeSpan.FromSeconds(5)))
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("MQTTnet broker.StartAsync timed out.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Serilog.Log.Debug("MQTTnet server initializing, started broker");
|
||||||
|
}
|
||||||
|
catch (System.Net.Sockets.SocketException socketEx)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(socketEx, "Socket exception");
|
||||||
|
LogContext();
|
||||||
|
//Serilog.Log.Warning("Socket exception disposing pubSocket");
|
||||||
|
//broker.Dispose();
|
||||||
|
//broker = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(ex, "MQTTnet broker.StartAsync failed.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//pubSocket.SendReady += PubSocket_SendReady;
|
||||||
|
//SendConnect();
|
||||||
|
|
||||||
|
cancellationTokenSource = new CancellationTokenSource();
|
||||||
|
//pullThread = new System.Threading.Thread(async () => await PullAsync(conn.pushPull, pullThreadCancellationTokenSource.Token));
|
||||||
|
//pullThread = new System.Threading.Thread(() => InitPull(conn.pushPull, pullTaskCancellationTokenSource.Token));
|
||||||
|
//pullThread.Start();
|
||||||
|
//Task.Run(() => InitPullAsync());
|
||||||
|
|
||||||
|
|
||||||
|
Serilog.Log.Debug("MQTTnet server initializing, initialized");
|
||||||
|
|
||||||
|
// need to sleep here, clients will take some time to start subscribing
|
||||||
|
// https://github.com/zeromq/netmq/issues/482#issuecomment-182200323
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
SendConnect();
|
||||||
|
|
||||||
|
Serilog.Log.Debug("MQTTnet server initializing, initialized at {port} with {projectPath}", port, Self!.ProjectPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task Broker_ClientDisconnectedAsync(ClientDisconnectedEventArgs arg)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var removed = _clients.TryRemove(arg.ClientId, out _);
|
||||||
|
Serilog.Log.Debug("Broker_ClientDisconnectedAsync {ClientId} {Result}", arg.ClientId, removed);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(ex, "async exception at {Location}", nameof(Broker_ClientDisconnectedAsync));
|
||||||
|
}
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task Broker_InterceptingPublishAsync(InterceptingPublishEventArgs arg)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// if server message
|
||||||
|
if (string.IsNullOrEmpty(arg.ClientId))
|
||||||
|
return Task.CompletedTask;
|
||||||
|
|
||||||
|
Serilog.Log.Verbose("mqttnet consume {topic} {content}", arg.ApplicationMessage.Topic, arg.ApplicationMessage.ConvertPayloadToString());
|
||||||
|
|
||||||
|
var topic = arg.ApplicationMessage.Topic;
|
||||||
|
var header = topic.Substring(3); // for "cs/" prefix
|
||||||
|
var content = arg.ApplicationMessage.ConvertPayloadToString();
|
||||||
|
|
||||||
|
MainThreadDispatcher.Add(() => syncMngr.ProcessMessage(header, content));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(ex, "async exception at {Location}", nameof(Broker_InterceptingPublishAsync));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
// LogContext();
|
||||||
|
|
||||||
|
Serilog.Log.Verbose("MQTTnet clearing {HasBroker}", (broker != null));
|
||||||
|
|
||||||
|
var server = broker;
|
||||||
|
if (server != null)
|
||||||
|
{
|
||||||
|
server.InterceptingPublishAsync -= Broker_InterceptingPublishAsync;
|
||||||
|
Serilog.Log.Verbose("MQTTnet clearing, removed events");
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellationTokenSource?.Cancel();
|
||||||
|
cancellationTokenSource = null;
|
||||||
|
Serilog.Log.Verbose("MQTTnet clearing, cancelled async token");
|
||||||
|
|
||||||
|
if (server == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// broker?.StopAsync().GetAwaiter().GetResult(); // this line was freezing Unity editor, so calling Task.Run().Wait() instead
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var stopTask = Task.Run(() => server.StopAsync());
|
||||||
|
if (!stopTask.Wait(TimeSpan.FromSeconds(5))) // give it five secs to complete
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("MQTTnet broker.StopAsync timed out.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error(ex, "MQTTnet broker.StopAsync failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Serilog.Log.Verbose("MQTTnet clearing, stopped broker");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
server.Dispose();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning(ex, "MQTTnet broker.Dispose failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
server = null;
|
||||||
|
broker = null;
|
||||||
|
|
||||||
|
Serilog.Log.Debug("MQTTnet clearing, cleared");
|
||||||
|
}
|
||||||
|
|
||||||
|
string SerializeObject<T>(T obj)
|
||||||
|
where T : class
|
||||||
|
{
|
||||||
|
// Odin cant serialize string arrays, https://github.com/TeamSirenix/odin-serializer/issues/26
|
||||||
|
//var buffer = OdinSerializer.SerializationUtility.SerializeValue<T>(obj, OdinSerializer.DataFormat.JSON);
|
||||||
|
//var str = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);
|
||||||
|
|
||||||
|
// Newtonsoft works fine, but needs package reference
|
||||||
|
//var str = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
|
||||||
|
|
||||||
|
// not working
|
||||||
|
//var str = EditorJsonUtility.ToJson(obj);
|
||||||
|
|
||||||
|
// needs nuget
|
||||||
|
//System.Text.Json.JsonSerializer;
|
||||||
|
|
||||||
|
//var str = TinyJson.JsonWriter.ToJson(obj);
|
||||||
|
//var str = Meryel.UnityCodeAssist.ProjectData.LitJson.JsonMapper.ToJson(obj);
|
||||||
|
var str = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendAux(Synchronizer.Model.IMessage message, bool logContent = true)
|
||||||
|
{
|
||||||
|
if (message == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SendAux(message.GetType().Name, message, logContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendAux(string messageType, object content, bool logContent = true)
|
||||||
|
{
|
||||||
|
if (logContent)
|
||||||
|
Serilog.Log.Debug("Publishing {MessageType} {@Content}", messageType, content);
|
||||||
|
else
|
||||||
|
Serilog.Log.Debug("Publishing {MessageType}", messageType);
|
||||||
|
|
||||||
|
var publisher = broker;
|
||||||
|
if (publisher != null)
|
||||||
|
//publisher.SendMoreFrame(messageType).SendFrame(SerializeObject(content));
|
||||||
|
{
|
||||||
|
var applicationMessage = new MqttApplicationMessageBuilder()
|
||||||
|
.WithTopic("sc/" + messageType) // sc/ => server->client message
|
||||||
|
.WithRetainFlag(false)
|
||||||
|
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce)
|
||||||
|
.WithPayload(SerializeObject(content))
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
//broker?.InjectApplicationMessage(new InjectedMqttApplicationMessage(applicationMessage), cancellationTokenSource?.Token ?? default).GetAwaiter().GetResult();
|
||||||
|
broker?.InjectApplicationMessage(new InjectedMqttApplicationMessage(applicationMessage), cancellationTokenSource?.Token ?? default);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Serilog.Log.Error("Publisher socket is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendConnect()
|
||||||
|
{
|
||||||
|
var connect = Self;
|
||||||
|
|
||||||
|
SendAux(connect);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendDisconnect()
|
||||||
|
{
|
||||||
|
var disconnect = new Synchronizer.Model.Disconnect()
|
||||||
|
{
|
||||||
|
ModelVersion = Self.ModelVersion,
|
||||||
|
ProjectPath = Self.ProjectPath,
|
||||||
|
ProjectName = Self.ProjectName,
|
||||||
|
ContactInfo = Self.ContactInfo,
|
||||||
|
AssemblyVersion = Self.AssemblyVersion,
|
||||||
|
LiteOrFull = Self.LiteOrFull,
|
||||||
|
NodeKind = Self.NodeKind,
|
||||||
|
ClientId = Self.ClientId,
|
||||||
|
};
|
||||||
|
|
||||||
|
SendAux(disconnect);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendConnectionInfo()
|
||||||
|
{
|
||||||
|
var connectionInfo = new Synchronizer.Model.ConnectionInfo()
|
||||||
|
{
|
||||||
|
ModelVersion = Self.ModelVersion,
|
||||||
|
ProjectPath = Self.ProjectPath,
|
||||||
|
ProjectName = Self.ProjectName,
|
||||||
|
ContactInfo = Self.ContactInfo,
|
||||||
|
AssemblyVersion = Self.AssemblyVersion,
|
||||||
|
LiteOrFull = Self.LiteOrFull,
|
||||||
|
NodeKind = Self.NodeKind,
|
||||||
|
ClientId = Self.ClientId,
|
||||||
|
};
|
||||||
|
|
||||||
|
SendAux(connectionInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendHandshake()
|
||||||
|
{
|
||||||
|
var handshake = new Synchronizer.Model.Handshake();
|
||||||
|
|
||||||
|
SendAux(handshake);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendRequestInternalLog()
|
||||||
|
{
|
||||||
|
var requestInternalLog = new Synchronizer.Model.RequestInternalLog();
|
||||||
|
|
||||||
|
SendAux(requestInternalLog);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendRequestUpdate(string app, string path, bool isInteractive)
|
||||||
|
{
|
||||||
|
var requestUpdate = new Synchronizer.Model.RequestUpdate()
|
||||||
|
{
|
||||||
|
App = app,
|
||||||
|
Path = path,
|
||||||
|
IsInteractive = isInteractive,
|
||||||
|
};
|
||||||
|
|
||||||
|
SendAux(requestUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendInternalLog()
|
||||||
|
{
|
||||||
|
var internalLog = new Synchronizer.Model.InternalLog()
|
||||||
|
{
|
||||||
|
LogContent = Logger.ELogger.GetInternalLogContent(),
|
||||||
|
};
|
||||||
|
|
||||||
|
SendAux(internalLog, logContent: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SendStringArrayAux(string id, string[] array)
|
||||||
|
{
|
||||||
|
var stringArray = new Synchronizer.Model.StringArray()
|
||||||
|
{
|
||||||
|
Id = id,
|
||||||
|
Array = array,
|
||||||
|
};
|
||||||
|
|
||||||
|
SendAux(stringArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendStringArrayContainerAux(params (string id, string[] array)[] container)
|
||||||
|
{
|
||||||
|
var stringArrayContainer = new Synchronizer.Model.StringArrayContainer()
|
||||||
|
{
|
||||||
|
Container = new Synchronizer.Model.StringArray[container.Length],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < container.Length; i++)
|
||||||
|
{
|
||||||
|
stringArrayContainer.Container[i] = new Synchronizer.Model.StringArray
|
||||||
|
{
|
||||||
|
Id = container[i].id,
|
||||||
|
Array = container[i].array
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
SendAux(stringArrayContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendTags(string[] tags) =>
|
||||||
|
SendStringArrayAux(Synchronizer.Model.Ids.Tags, tags);
|
||||||
|
|
||||||
|
public void SendLayers(string[] layerNames, string[] layerIndices)
|
||||||
|
{
|
||||||
|
SendStringArrayContainerAux(
|
||||||
|
(Synchronizer.Model.Ids.Layers, layerNames),
|
||||||
|
(Synchronizer.Model.Ids.LayerIndices, layerIndices));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendSortingLayers(string[] sortingLayers, string[] sortingLayerIds, string[] sortingLayerValues)
|
||||||
|
{
|
||||||
|
SendStringArrayContainerAux(
|
||||||
|
(Synchronizer.Model.Ids.SortingLayers, sortingLayers),
|
||||||
|
(Synchronizer.Model.Ids.SortingLayerIds, sortingLayerIds),
|
||||||
|
(Synchronizer.Model.Ids.SortingLayerValues, sortingLayerValues));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendRenderingLayers(string[] renderingLayers, string[] renderingLayerIndices)
|
||||||
|
{
|
||||||
|
SendStringArrayContainerAux(
|
||||||
|
(Synchronizer.Model.Ids.RenderingLayers, renderingLayers),
|
||||||
|
(Synchronizer.Model.Ids.RenderingLayerIndices, renderingLayerIndices));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendPlayerPrefs(string[] playerPrefKeys, string[] playerPrefValues,
|
||||||
|
string[] playerPrefStringKeys, string[] playerPrefIntegerKeys, string[] playerPrefFloatKeys)
|
||||||
|
{
|
||||||
|
SendStringArrayContainerAux(
|
||||||
|
(Synchronizer.Model.Ids.PlayerPrefKeys, playerPrefKeys),
|
||||||
|
(Synchronizer.Model.Ids.PlayerPrefValues, playerPrefValues),
|
||||||
|
(Synchronizer.Model.Ids.PlayerPrefStringKeys, playerPrefStringKeys),
|
||||||
|
(Synchronizer.Model.Ids.PlayerPrefIntegerKeys, playerPrefIntegerKeys),
|
||||||
|
(Synchronizer.Model.Ids.PlayerPrefFloatKeys, playerPrefFloatKeys)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendEditorPrefs(string[] editorPrefKeys, string[] editorPrefValues,
|
||||||
|
string[] editorPrefStringKeys, string[] editorPrefIntegerKeys, string[] editorPrefFloatKeys,
|
||||||
|
string[] editorPrefBooleanKeys)
|
||||||
|
{
|
||||||
|
SendStringArrayContainerAux(
|
||||||
|
(Synchronizer.Model.Ids.EditorPrefKeys, editorPrefKeys),
|
||||||
|
(Synchronizer.Model.Ids.EditorPrefValues, editorPrefValues),
|
||||||
|
(Synchronizer.Model.Ids.EditorPrefStringKeys, editorPrefStringKeys),
|
||||||
|
(Synchronizer.Model.Ids.EditorPrefIntegerKeys, editorPrefIntegerKeys),
|
||||||
|
(Synchronizer.Model.Ids.EditorPrefFloatKeys, editorPrefFloatKeys),
|
||||||
|
(Synchronizer.Model.Ids.EditorPrefBooleanKeys, editorPrefBooleanKeys)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendInputManager(string[] axisNames, string[] axisInfos, string[] buttonKeys, string[] buttonAxis, string[] joystickNames)
|
||||||
|
{
|
||||||
|
SendStringArrayContainerAux(
|
||||||
|
(Synchronizer.Model.Ids.InputManagerAxes, axisNames),
|
||||||
|
(Synchronizer.Model.Ids.InputManagerAxisInfos, axisInfos),
|
||||||
|
(Synchronizer.Model.Ids.InputManagerButtonKeys, buttonKeys),
|
||||||
|
(Synchronizer.Model.Ids.InputManagerButtonAxis, buttonAxis),
|
||||||
|
(Synchronizer.Model.Ids.InputManagerJoystickNames, joystickNames)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendSceneList(string[] sceneNames, string[] scenePaths, string[] sceneBuildIndices,
|
||||||
|
string[] sceneNamesAndPaths, string[] scenePathsAndNames)
|
||||||
|
{
|
||||||
|
SendStringArrayContainerAux(
|
||||||
|
(Synchronizer.Model.Ids.SceneNames, sceneNames),
|
||||||
|
(Synchronizer.Model.Ids.ScenePaths, scenePaths),
|
||||||
|
(Synchronizer.Model.Ids.SceneBuildIndices, sceneBuildIndices),
|
||||||
|
(Synchronizer.Model.Ids.SceneNamesAndPaths, sceneNamesAndPaths),
|
||||||
|
(Synchronizer.Model.Ids.ScenePathsAndNames, scenePathsAndNames)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendScriptMissing(string component)
|
||||||
|
{
|
||||||
|
var scriptMissing = new Synchronizer.Model.ScriptMissing()
|
||||||
|
{
|
||||||
|
Component = component,
|
||||||
|
};
|
||||||
|
|
||||||
|
SendAux(scriptMissing);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendComponentHumanTrait(string[] bones, string[] muscles)
|
||||||
|
{
|
||||||
|
//var humanTrait = new Synchronizer.Model.Components.HumanTrait();
|
||||||
|
|
||||||
|
var boneIndices = new string[bones.Length];
|
||||||
|
var boneNames = new string[bones.Length];
|
||||||
|
for (int i = 0; i < bones.Length; i++)
|
||||||
|
{
|
||||||
|
boneIndices[i] = i.ToString();
|
||||||
|
boneNames[i] = bones[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
var muscleIndices = new string[muscles.Length];
|
||||||
|
var muscleNames = new string[muscles.Length];
|
||||||
|
for (int i = 0; i < muscles.Length; i++)
|
||||||
|
{
|
||||||
|
muscleIndices[i] = i.ToString();
|
||||||
|
muscleNames[i] = muscles[i];
|
||||||
|
}
|
||||||
|
SendStringArrayContainerAux(
|
||||||
|
(Synchronizer.Model.Ids.AnimationHumanBones, boneNames),
|
||||||
|
(Synchronizer.Model.Ids.AnimationHumanBoneIndices, boneIndices),
|
||||||
|
(Synchronizer.Model.Ids.AnimationHumanMuscles, muscleNames),
|
||||||
|
(Synchronizer.Model.Ids.AnimationHumanMuscleIndices, muscleIndices)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendShaderGlobalKeywords()
|
||||||
|
{
|
||||||
|
SendStringArrayAux(Synchronizer.Model.Ids.ShaderGlobalKeywords, Shader.globalKeywords.Select(k => k.name).ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendGameObject(GameObject go)
|
||||||
|
{
|
||||||
|
if (!go)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Serilog.Log.Debug("SendGO: {GoName}", go.name);
|
||||||
|
|
||||||
|
var dataOfSelf = go.ToSyncModel(priority:10000);
|
||||||
|
if (dataOfSelf != null)
|
||||||
|
SendAux(dataOfSelf);
|
||||||
|
|
||||||
|
var dataOfHierarchy = go.ToSyncModelOfHierarchy();
|
||||||
|
if (dataOfHierarchy != null)
|
||||||
|
{
|
||||||
|
foreach (var doh in dataOfHierarchy)
|
||||||
|
SendAux(doh);
|
||||||
|
}
|
||||||
|
|
||||||
|
var dataOfComponents = go.ToSyncModelOfComponents();
|
||||||
|
if (dataOfComponents != null)
|
||||||
|
{
|
||||||
|
foreach (var doc in dataOfComponents)
|
||||||
|
SendAux(doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
var dataOfComponentAnimator = go.ToSyncModelOfComponentAnimator();
|
||||||
|
if (dataOfComponentAnimator != null)
|
||||||
|
SendAux(dataOfComponentAnimator);
|
||||||
|
|
||||||
|
var dataOfComponentAnimation = go.ToSyncModelOfComponentAnimation();
|
||||||
|
if (dataOfComponentAnimation != null)
|
||||||
|
SendAux(dataOfComponentAnimation);
|
||||||
|
|
||||||
|
var dataOfComponentMaterial = go.ToSyncModelOfComponentMaterial();
|
||||||
|
if (dataOfComponentMaterial != null)
|
||||||
|
SendAux(dataOfComponentMaterial);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendScriptableObject(ScriptableObject so)
|
||||||
|
{
|
||||||
|
Serilog.Log.Debug("SendSO: {SoName}", so.name);
|
||||||
|
|
||||||
|
var dataOfSo = so.ToSyncModel();
|
||||||
|
if (dataOfSo != null)
|
||||||
|
SendAux(dataOfSo);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendAnalyticsEvent(string type, string content)
|
||||||
|
{
|
||||||
|
var analyticsEvent = new Synchronizer.Model.AnalyticsEvent()
|
||||||
|
{
|
||||||
|
EventType = type,
|
||||||
|
EventContent = content
|
||||||
|
};
|
||||||
|
SendAux(analyticsEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendErrorReport(string errorMessage, string stack, string type)
|
||||||
|
{
|
||||||
|
var errorReport = new Synchronizer.Model.ErrorReport()
|
||||||
|
{
|
||||||
|
ErrorMessage = errorMessage,
|
||||||
|
ErrorStack = stack,
|
||||||
|
ErrorType = type,
|
||||||
|
};
|
||||||
|
SendAux(errorReport);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendRequestVerboseType(string type, string docPath)
|
||||||
|
{
|
||||||
|
var requestVerboseType = new Synchronizer.Model.RequestVerboseType()
|
||||||
|
{
|
||||||
|
Type = type,
|
||||||
|
DocPath = docPath,
|
||||||
|
};
|
||||||
|
SendAux(requestVerboseType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ForwardRelayMessage(Synchronizer.Model.IRelayMessage relayMessage)
|
||||||
|
{
|
||||||
|
SendAux(relayMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Synchronizer.Model.IProcessor.Serialize<T>(T value)
|
||||||
|
{
|
||||||
|
//return System.Text.Json.JsonSerializer.Serialize<T>(value);
|
||||||
|
//return Newtonsoft.Json.JsonConvert.SerializeObject(value);
|
||||||
|
return SerializeObject(value);
|
||||||
|
}
|
||||||
|
T Synchronizer.Model.IProcessor.Deserialize<T>(string data)
|
||||||
|
{
|
||||||
|
//return System.Text.Json.JsonSerializer.Deserialize<T>(data)!;
|
||||||
|
//return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(data)!;
|
||||||
|
//return TinyJson.JsonParser.FromJson<T>(data)!;
|
||||||
|
//return Meryel.UnityCodeAssist.ProjectData.LitJson.JsonMapper.ToObject<T>(data);
|
||||||
|
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(data)!;
|
||||||
|
|
||||||
|
//byte[] buffer = System.Text.Encoding.UTF8.GetBytes(data);
|
||||||
|
//T val = OdinSerializer.SerializationUtility.DeserializeValue<T>(buffer, OdinSerializer.DataFormat.JSON);
|
||||||
|
//return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
//**--make sure all Synchronizer.Model.IProcessor.Process methods are thread-safe
|
||||||
|
|
||||||
|
// a new client has connected
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Connect connect)
|
||||||
|
{
|
||||||
|
if (connect.ModelVersion != Self.ModelVersion)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("Version mismatch with {ContactInfo}. Please update your Unity asset and reinstall the Visual Studio/VS Code extension. {ContactModel} != {SelfModel}", connect.ContactInfo, connect.ModelVersion, Self.ModelVersion);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connect.ProjectPath != Self.ProjectPath)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("Project mismatch with {ProjectName}. '{ConnectPath}' != '{SelfPath}'", connect.ProjectName, connect.ProjectPath, Self.ProjectPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(connect.LiteOrFull) && connect.LiteOrFull != Self.LiteOrFull)
|
||||||
|
{
|
||||||
|
if (connect.LiteOrFull == "Lite")
|
||||||
|
{
|
||||||
|
//**-- upgrade vsix to full here //**--//**--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var hasClient = _clients.TryGetValue(connect.ClientId, out var client);
|
||||||
|
if (!hasClient)
|
||||||
|
_clients[connect.ClientId] = connect;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// LiteOrFull field might be updated
|
||||||
|
client.ModelVersion = connect.ModelVersion;
|
||||||
|
client.ProjectPath = connect.ProjectPath;
|
||||||
|
client.ProjectName = connect.ProjectName;
|
||||||
|
client.ContactInfo = connect.ContactInfo;
|
||||||
|
client.AssemblyVersion = connect.AssemblyVersion;
|
||||||
|
client.LiteOrFull = connect.LiteOrFull;
|
||||||
|
client.NodeKind = connect.NodeKind;
|
||||||
|
client.ClientId = connect.ClientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
SendHandshake();
|
||||||
|
if (ScriptFinder.GetActiveGameObject(out var activeGO))
|
||||||
|
SendGameObject(activeGO);
|
||||||
|
Assister.SendTagsAndLayers();
|
||||||
|
}
|
||||||
|
|
||||||
|
// a new client is online and requesting connection
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestConnect requestConnect)
|
||||||
|
{
|
||||||
|
SendConnect();
|
||||||
|
}
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Disconnect disconnect)
|
||||||
|
{
|
||||||
|
var removed = _clients.TryRemove(disconnect.ClientId, out var client);
|
||||||
|
Serilog.Log.Debug("Synchronizer.Model.Disconnect {ClientId} {Removed}", disconnect.ClientId, removed);
|
||||||
|
}
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ConnectionInfo connectionInfo)
|
||||||
|
{
|
||||||
|
if (connectionInfo.ModelVersion != Self.ModelVersion)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("Version mismatch with {ContactInfo}. Please update your Unity asset and reinstall the Visual Studio/VS Code extension. {ContactModel} != {SelfModel}", connectionInfo.ContactInfo, connectionInfo.ModelVersion, Self.ModelVersion);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connectionInfo.ProjectPath != Self.ProjectPath)
|
||||||
|
{
|
||||||
|
Serilog.Log.Error("Project mismatch with {ProjectName}. '{ConnectPath}' != '{SelfPath}'", connectionInfo.ProjectName, connectionInfo.ProjectPath, Self.ProjectPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_clients.TryGetValue(connectionInfo.ClientId, out _))
|
||||||
|
{
|
||||||
|
SendConnect();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SendHandshake();
|
||||||
|
if (ScriptFinder.GetActiveGameObject(out var activeGO))
|
||||||
|
SendGameObject(activeGO);
|
||||||
|
Assister.SendTagsAndLayers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestConnectionInfo requestConnectionInfo)
|
||||||
|
{
|
||||||
|
SendConnectionInfo();
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Layers layers)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Tags tags)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.SortingLayers sortingLayers)
|
||||||
|
{
|
||||||
|
|
||||||
|
}*/
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.StringArray stringArray)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.StringArray)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.StringArrayContainer stringArrayContainer)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.StringArrayContainer)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.GameObject gameObject)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.GameObject)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ComponentData component)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ComponentData)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Component_Animator component_Animator)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Component_Animator)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Component_Animation component_Animation)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Component_Animation)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Component_Material component_Material)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Component_Material)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestScript requestScript)
|
||||||
|
{
|
||||||
|
if (requestScript.DeclaredTypes == null || requestScript.DeclaredTypes.Length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var documentPath = requestScript.DocumentPath;
|
||||||
|
|
||||||
|
foreach (var declaredType in requestScript.DeclaredTypes)
|
||||||
|
{
|
||||||
|
if (ScriptFinder.FindInstanceOfType(declaredType, documentPath, out var go, out var so))
|
||||||
|
{
|
||||||
|
if (go != null)
|
||||||
|
SendGameObject(go);
|
||||||
|
else if (so != null)
|
||||||
|
SendScriptableObject(so);
|
||||||
|
else
|
||||||
|
Serilog.Log.Warning("Invalid instance of type");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SendScriptMissing(declaredType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestScriptFast requestScriptFast)
|
||||||
|
{
|
||||||
|
var documentPath = requestScriptFast.DocumentPath;
|
||||||
|
|
||||||
|
//**--namespace?
|
||||||
|
var possiblyDeclaredType = Path.GetFileNameWithoutExtension(documentPath);
|
||||||
|
|
||||||
|
if (ScriptFinder.FindInstanceOfType(possiblyDeclaredType, documentPath, out var go, out var so))
|
||||||
|
{
|
||||||
|
if (go != null)
|
||||||
|
SendGameObject(go);
|
||||||
|
else if (so != null)
|
||||||
|
SendScriptableObject(so);
|
||||||
|
else
|
||||||
|
Serilog.Log.Warning("Invalid instance of type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ScriptMissing scriptMissing)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ScriptMissing)");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Handshake handshake)
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestInternalLog requestInternalLog)
|
||||||
|
{
|
||||||
|
SendInternalLog();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.InternalLog internalLog)
|
||||||
|
{
|
||||||
|
Logger.ELogger.VsInternalLog = internalLog.LogContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.AnalyticsEvent analyticsEvent)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.AnalyticsEvent)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ErrorReport errorReport)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ErrorReport)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestVerboseType requestVerboseType)
|
||||||
|
{
|
||||||
|
Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestVerboseType)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestLazyLoad requestLazyLoad)
|
||||||
|
{
|
||||||
|
Monitor.LazyLoad(requestLazyLoad.Category);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal Synchronizer.Model.RequestUpdate? DelayedRequestUpdate { get; private set; }
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestUpdate requestUpdate)
|
||||||
|
{
|
||||||
|
if (requestUpdate.App != "Unity" && requestUpdate.App != "SystemBinariesForDotNetStandard20")
|
||||||
|
return;
|
||||||
|
|
||||||
|
// cannot import package in play mode, so delay it
|
||||||
|
if (EditorApplication.isPlayingOrWillChangePlaymode)
|
||||||
|
{
|
||||||
|
Serilog.Log.Information("Cannot import package in play mode, please exit play mode to update");
|
||||||
|
DelayedRequestUpdate = requestUpdate;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DelayedRequestUpdate = null;
|
||||||
|
|
||||||
|
// let unity update the package, don't unzip it, to prevent file already in use and other issues
|
||||||
|
AssetDatabase.ImportPackage(requestUpdate.Path, requestUpdate.IsInteractive);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RelayDocumentShow relayDocumentShow)
|
||||||
|
{
|
||||||
|
ForwardRelayMessage(relayDocumentShow);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RelayDocumentSave relayDocumentSave)
|
||||||
|
{
|
||||||
|
ForwardRelayMessage(relayDocumentSave);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RelayDocumentViewportChanged relayDocumentViewportChanged)
|
||||||
|
{
|
||||||
|
ForwardRelayMessage(relayDocumentViewportChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RelayLogMessage relayLogMessage)
|
||||||
|
{
|
||||||
|
ForwardRelayMessage(relayLogMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RelayUpdateExport relayUpdateExport)
|
||||||
|
{
|
||||||
|
ForwardRelayMessage(relayUpdateExport);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RelayAdornmentText relayAdornmentText)
|
||||||
|
{
|
||||||
|
ForwardRelayMessage(relayAdornmentText);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user