no message
This commit is contained in:
8
Assets/Audio.meta
Normal file
8
Assets/Audio.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 11df597fea8fb461a965d831c26e7568
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/Audio/camera-shutter1.mp3
Executable file
BIN
Assets/Audio/camera-shutter1.mp3
Executable file
Binary file not shown.
23
Assets/Audio/camera-shutter1.mp3.meta
Normal file
23
Assets/Audio/camera-shutter1.mp3.meta
Normal file
@@ -0,0 +1,23 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6a6771d05326c4775a47c0ec4c4e4558
|
||||
AudioImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 8
|
||||
defaultSettings:
|
||||
serializedVersion: 2
|
||||
loadType: 0
|
||||
sampleRateSetting: 0
|
||||
sampleRateOverride: 44100
|
||||
compressionFormat: 1
|
||||
quality: 1
|
||||
conversionMode: 0
|
||||
preloadAudioData: 0
|
||||
platformSettingOverrides: {}
|
||||
forceToMono: 0
|
||||
normalize: 1
|
||||
loadInBackground: 0
|
||||
ambisonic: 0
|
||||
3D: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -308,6 +308,8 @@ GameObject:
|
||||
- component: {fileID: 162178408}
|
||||
- component: {fileID: 162178410}
|
||||
- component: {fileID: 162178409}
|
||||
- component: {fileID: 162178412}
|
||||
- component: {fileID: 162178411}
|
||||
m_Layer: 5
|
||||
m_Name: Image Character
|
||||
m_TagString: Untagged
|
||||
@@ -331,7 +333,7 @@ RectTransform:
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||
m_AnchoredPosition: {x: -267.873, y: 126.63}
|
||||
m_AnchoredPosition: {x: -162, y: 80}
|
||||
m_SizeDelta: {x: 424.251, y: 424.25}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &162178409
|
||||
@@ -372,6 +374,247 @@ CanvasRenderer:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 162178407}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!82 &162178411
|
||||
AudioSource:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 162178407}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 4
|
||||
OutputAudioMixerGroup: {fileID: 0}
|
||||
m_audioClip: {fileID: 0}
|
||||
m_Resource: {fileID: 8300000, guid: 6a6771d05326c4775a47c0ec4c4e4558, type: 3}
|
||||
m_PlayOnAwake: 0
|
||||
m_Volume: 1
|
||||
m_Pitch: 1
|
||||
Loop: 0
|
||||
Mute: 0
|
||||
Spatialize: 0
|
||||
SpatializePostEffects: 0
|
||||
Priority: 128
|
||||
DopplerLevel: 1
|
||||
MinDistance: 1
|
||||
MaxDistance: 500
|
||||
Pan2D: 0
|
||||
rolloffMode: 0
|
||||
BypassEffects: 0
|
||||
BypassListenerEffects: 0
|
||||
BypassReverbZones: 0
|
||||
rolloffCustomCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
- serializedVersion: 3
|
||||
time: 1
|
||||
value: 0
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
panLevelCustomCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
spreadCustomCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
reverbZoneMixCustomCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
--- !u!114 &162178412
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 162178407}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 4d0390bd8b8ffd640b34fe25065ff1df, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: Assembly-CSharp-firstpass::DG.Tweening.DOTweenAnimation
|
||||
updateType: 0
|
||||
isSpeedBased: 0
|
||||
hasOnStart: 0
|
||||
hasOnPlay: 1
|
||||
hasOnUpdate: 0
|
||||
hasOnStepComplete: 0
|
||||
hasOnComplete: 1
|
||||
hasOnTweenCreated: 0
|
||||
hasOnRewind: 0
|
||||
onStart:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onPlay:
|
||||
m_PersistentCalls:
|
||||
m_Calls:
|
||||
- m_Target: {fileID: 162178409}
|
||||
m_TargetAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI
|
||||
m_MethodName: set_sprite
|
||||
m_Mode: 2
|
||||
m_Arguments:
|
||||
m_ObjectArgument: {fileID: 21300000, guid: b003007f0724f4eb39ca05642c497ce4, type: 3}
|
||||
m_ObjectArgumentAssemblyTypeName: UnityEngine.Sprite, UnityEngine
|
||||
m_IntArgument: 0
|
||||
m_FloatArgument: 0
|
||||
m_StringArgument:
|
||||
m_BoolArgument: 0
|
||||
m_CallState: 2
|
||||
- m_Target: {fileID: 162178411}
|
||||
m_TargetAssemblyTypeName: UnityEngine.AudioSource, UnityEngine
|
||||
m_MethodName: Play
|
||||
m_Mode: 1
|
||||
m_Arguments:
|
||||
m_ObjectArgument: {fileID: 0}
|
||||
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||
m_IntArgument: 0
|
||||
m_FloatArgument: 0
|
||||
m_StringArgument:
|
||||
m_BoolArgument: 0
|
||||
m_CallState: 2
|
||||
onUpdate:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onStepComplete:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onComplete:
|
||||
m_PersistentCalls:
|
||||
m_Calls:
|
||||
- m_Target: {fileID: 162178409}
|
||||
m_TargetAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI
|
||||
m_MethodName: set_sprite
|
||||
m_Mode: 2
|
||||
m_Arguments:
|
||||
m_ObjectArgument: {fileID: 21300000, guid: 7ab63bd8191ef49a6918352ece3c5364, type: 3}
|
||||
m_ObjectArgumentAssemblyTypeName: UnityEngine.Sprite, UnityEngine
|
||||
m_IntArgument: 0
|
||||
m_FloatArgument: 0
|
||||
m_StringArgument:
|
||||
m_BoolArgument: 0
|
||||
m_CallState: 2
|
||||
onTweenCreated:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onRewind:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
targetIsSelf: 1
|
||||
targetGO: {fileID: 0}
|
||||
tweenTargetIsTargetGO: 1
|
||||
delay: 0
|
||||
duration: 0.5
|
||||
easeType: 6
|
||||
easeCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
- serializedVersion: 3
|
||||
time: 1
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
loopType: 0
|
||||
loops: 1
|
||||
id:
|
||||
isRelative: 0
|
||||
isFrom: 0
|
||||
isIndependentUpdate: 0
|
||||
autoKill: 0
|
||||
autoGenerate: 1
|
||||
isActive: 1
|
||||
isValid: 1
|
||||
target: {fileID: 162178408}
|
||||
animationType: 9
|
||||
targetType: 5
|
||||
forcedTargetType: 0
|
||||
autoPlay: 0
|
||||
useTargetAsV3: 0
|
||||
endValueFloat: 0
|
||||
endValueV3: {x: 0, y: 10, z: 1}
|
||||
endValueV2: {x: 0, y: 0}
|
||||
endValueColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
endValueString:
|
||||
endValueRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
endValueTransform: {fileID: 0}
|
||||
optionalBool0: 0
|
||||
optionalBool1: 0
|
||||
optionalFloat0: 1
|
||||
optionalInt0: 1
|
||||
optionalRotationMode: 0
|
||||
optionalScrambleMode: 0
|
||||
optionalShakeRandomnessMode: 0
|
||||
optionalString:
|
||||
--- !u!1 &240954698
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -469,6 +712,18 @@ MonoBehaviour:
|
||||
m_StringArgument:
|
||||
m_BoolArgument: 0
|
||||
m_CallState: 2
|
||||
- m_Target: {fileID: 162178412}
|
||||
m_TargetAssemblyTypeName: DG.Tweening.DOTweenAnimation, Assembly-CSharp-firstpass
|
||||
m_MethodName: DORestart
|
||||
m_Mode: 1
|
||||
m_Arguments:
|
||||
m_ObjectArgument: {fileID: 0}
|
||||
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
|
||||
m_IntArgument: 0
|
||||
m_FloatArgument: 0
|
||||
m_StringArgument:
|
||||
m_BoolArgument: 0
|
||||
m_CallState: 2
|
||||
--- !u!114 &240954701
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -522,7 +777,7 @@ MonoBehaviour:
|
||||
selectMonitorIndex: 2
|
||||
takeNumber: 0
|
||||
inputPrefix: {fileID: 56188227}
|
||||
inputResult: {fileID: 0}
|
||||
inputResult: {fileID: 975488549}
|
||||
directorySelector: {fileID: 1438379834}
|
||||
--- !u!1 &519420028
|
||||
GameObject:
|
||||
@@ -889,7 +1144,7 @@ MonoBehaviour:
|
||||
m_lineSpacingMax: 0
|
||||
m_paragraphSpacing: 0
|
||||
m_charWidthMaxAdj: 0
|
||||
m_TextWrappingMode: 3
|
||||
m_TextWrappingMode: 1
|
||||
m_wordWrappingRatios: 0.4
|
||||
m_overflowMode: 3
|
||||
m_linkedTextComponent: {fileID: 0}
|
||||
@@ -1395,7 +1650,7 @@ MonoBehaviour:
|
||||
m_InputType: 0
|
||||
m_AsteriskChar: 42
|
||||
m_KeyboardType: 0
|
||||
m_LineType: 0
|
||||
m_LineType: 1
|
||||
m_HideMobileInput: 0
|
||||
m_HideSoftKeyboard: 0
|
||||
m_CharacterValidation: 0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4fb1de9b00bfac42af0a35ff2a01f89
|
||||
guid: 9f80792dcd2829e41b1f075e7245ca5b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>DOTweenUpgradeManager</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:DG.DOTweenUpgradeManager.Autorun">
|
||||
<summary>
|
||||
This class and its whole library are deleted the first time DOTween's setup is run after an upgrade (or after a new install).
|
||||
NOTE: DidReloadScripts doesn't work on first install so it's useless, InitializeOnLoad is the only way
|
||||
</summary>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3df9fdaadcb4c394e826a4d8d20bb952
|
||||
TextScriptImporter:
|
||||
userData:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 27676
|
||||
packageName: DOTween (HOTween v2)
|
||||
packageVersion: 1.2.790
|
||||
assetPath: Assets/Plugins/Demigiant/DOTween/Editor/DOTweenUpgradeManager.XML
|
||||
uploadId: 831234
|
||||
Binary file not shown.
@@ -1,29 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2bf936a5d80799e4e88ec9270fea75a4
|
||||
PluginImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
isPreloaded: 0
|
||||
platformData:
|
||||
Any:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
Editor:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
WindowsStoreApps:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 27676
|
||||
packageName: DOTween (HOTween v2)
|
||||
packageVersion: 1.2.790
|
||||
assetPath: Assets/Plugins/Demigiant/DOTween/Editor/DOTweenUpgradeManager.dll
|
||||
uploadId: 831234
|
||||
8
Assets/Resources.meta
Normal file
8
Assets/Resources.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: edff7c9c5dfec49dbae75dcfc0b847d3
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
54
Assets/Resources/DOTweenSettings.asset
Normal file
54
Assets/Resources/DOTweenSettings.asset
Normal file
@@ -0,0 +1,54 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 16995157, guid: a811bde74b26b53498b4f6d872b09b6d, type: 3}
|
||||
m_Name: DOTweenSettings
|
||||
m_EditorClassIdentifier: DOTween.dll::DG.Tweening.Core.DOTweenSettings
|
||||
useSafeMode: 1
|
||||
safeModeOptions:
|
||||
logBehaviour: 2
|
||||
nestedTweenFailureBehaviour: 0
|
||||
timeScale: 1
|
||||
unscaledTimeScale: 1
|
||||
useSmoothDeltaTime: 0
|
||||
maxSmoothUnscaledTime: 0.15
|
||||
rewindCallbackMode: 0
|
||||
showUnityEditorReport: 0
|
||||
logBehaviour: 0
|
||||
drawGizmos: 1
|
||||
defaultRecyclable: 0
|
||||
defaultAutoPlay: 3
|
||||
defaultUpdateType: 0
|
||||
defaultTimeScaleIndependent: 0
|
||||
defaultEaseType: 6
|
||||
defaultEaseOvershootOrAmplitude: 1.70158
|
||||
defaultEasePeriod: 0
|
||||
defaultAutoKill: 1
|
||||
defaultLoopType: 0
|
||||
debugMode: 0
|
||||
debugStoreTargetId: 1
|
||||
showPreviewPanel: 1
|
||||
storeSettingsLocation: 0
|
||||
modules:
|
||||
showPanel: 0
|
||||
audioEnabled: 1
|
||||
physicsEnabled: 1
|
||||
physics2DEnabled: 1
|
||||
spriteEnabled: 1
|
||||
uiEnabled: 1
|
||||
textMeshProEnabled: 0
|
||||
tk2DEnabled: 0
|
||||
deAudioEnabled: 0
|
||||
deUnityExtendedEnabled: 0
|
||||
epoOutlineEnabled: 0
|
||||
createASMDEF: 0
|
||||
showPlayingTweens: 0
|
||||
showPausedTweens: 0
|
||||
8
Assets/Resources/DOTweenSettings.asset.meta
Normal file
8
Assets/Resources/DOTweenSettings.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f3fb915957f684d8abb924862bfc3cb3
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,43 +1,28 @@
|
||||
using UnityEngine;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows.Forms; // 모니터 식별 및 스크린 정보
|
||||
using System.Drawing; // Bitmap 관련
|
||||
using System.Drawing.Imaging;
|
||||
using System.Runtime.InteropServices;
|
||||
using TMPro;
|
||||
using Unity.VisualScripting;
|
||||
using Application = UnityEngine.Application;
|
||||
using Screen = System.Windows.Forms.Screen;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
||||
using System.Windows.Forms;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using Graphics = System.Drawing.Graphics;
|
||||
#endif
|
||||
|
||||
public class TakeScreen : MonoBehaviour
|
||||
{
|
||||
// 캡처할 모니터 인덱스 (2 = 첫번째 모니터)
|
||||
public int selectMonitorIndex = 2;
|
||||
public int takeNumber;
|
||||
int monitorIndex = 0;
|
||||
|
||||
MONITORINFO selectMonitor;
|
||||
int selectWidth;
|
||||
int selectHeight;
|
||||
|
||||
[SerializeField]
|
||||
TMP_InputField inputPrefix;
|
||||
|
||||
[SerializeField]
|
||||
TMP_InputField inputResult;
|
||||
|
||||
[SerializeField]
|
||||
DirectorySelect directorySelector;
|
||||
|
||||
// WinAPI 구조체
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct RECT
|
||||
{
|
||||
public int left, top, right, bottom;
|
||||
}
|
||||
[SerializeField] TMP_InputField inputPrefix;
|
||||
[SerializeField] TMP_InputField inputResult;
|
||||
[SerializeField] DirectorySelect directorySelector;
|
||||
|
||||
// --- Windows 전용 구조체 및 변수 ---
|
||||
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
||||
[StructLayout(LayoutKind.Sequential)] public struct RECT { public int left, top, right, bottom; }
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
||||
public struct MONITORINFO
|
||||
{
|
||||
@@ -45,109 +30,107 @@ public class TakeScreen : MonoBehaviour
|
||||
public RECT rcMonitor;
|
||||
public RECT rcWork;
|
||||
public int dwFlags;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
|
||||
public string szDevice;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string szDevice;
|
||||
}
|
||||
|
||||
// WinAPI 델리게이트
|
||||
private delegate bool MonitorEnumProc(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData);
|
||||
[DllImport("user32.dll")] private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumProc lpfnEnum, IntPtr dwData);
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi);
|
||||
[DllImport("user32.dll")] private static extern IntPtr GetDC(IntPtr hWnd);
|
||||
[DllImport("gdi32.dll")] private static extern IntPtr CreateCompatibleDC(IntPtr hdc);
|
||||
[DllImport("gdi32.dll")] private static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int width, int height);
|
||||
[DllImport("gdi32.dll")] private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
|
||||
[DllImport("gdi32.dll")] private static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
|
||||
[DllImport("gdi32.dll")] private static extern bool DeleteObject(IntPtr hObject);
|
||||
[DllImport("gdi32.dll")] private static extern bool DeleteDC(IntPtr hdc);
|
||||
[DllImport("user32.dll")] private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
|
||||
|
||||
// WinAPI 함수
|
||||
[DllImport("user32.dll")]
|
||||
private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumProc lpfnEnum, IntPtr dwData);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||
private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr GetDC(IntPtr hWnd);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern IntPtr CreateCompatibleDC(IntPtr hdc);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int width, int height);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
|
||||
IntPtr hdcSrc, int nXSrc, int nYSrc, CopyPixelOperation dwRop);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern bool DeleteObject(IntPtr hObject);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern bool DeleteDC(IntPtr hdc);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
|
||||
|
||||
MONITORINFO selectMonitor;
|
||||
int selectWidth;
|
||||
int selectHeight;
|
||||
int monitorIndex = 0;
|
||||
#endif
|
||||
|
||||
private void Start()
|
||||
{
|
||||
Debug.Log("=== 모든 모니터 정보 ===");
|
||||
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
||||
EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorCallback, IntPtr.Zero);
|
||||
#else
|
||||
Debug.Log("macOS 환경입니다. 시스템 기본 스크린샷 기능을 사용합니다.");
|
||||
#endif
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
||||
private bool MonitorCallback(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData)
|
||||
{
|
||||
MONITORINFO mi = new MONITORINFO();
|
||||
mi.cbSize = Marshal.SizeOf(typeof(MONITORINFO));
|
||||
monitorIndex++;
|
||||
|
||||
if (GetMonitorInfo(hMonitor, ref mi) && monitorIndex == selectMonitorIndex)
|
||||
{
|
||||
int width = mi.rcMonitor.right - mi.rcMonitor.left;
|
||||
int height = mi.rcMonitor.bottom - mi.rcMonitor.top;
|
||||
bool isPrimary = (mi.dwFlags & 1) != 0;
|
||||
|
||||
Debug.Log(
|
||||
$"{mi.szDevice} 모니터 \n" +
|
||||
$" - 해상도 : {width} x {height}\n" +
|
||||
$" - 위치 : x = {mi.rcMonitor.left}, y = {mi.rcMonitor.top}\n" +
|
||||
$" - 주 모니터 여부 : {isPrimary}\n"
|
||||
);
|
||||
|
||||
selectMonitor = mi;
|
||||
selectWidth = width;
|
||||
selectHeight = height;
|
||||
selectWidth = mi.rcMonitor.right - mi.rcMonitor.left;
|
||||
selectHeight = mi.rcMonitor.bottom - mi.rcMonitor.top;
|
||||
}
|
||||
|
||||
return true; // 계속 나머지 모니터 순회
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
public void Take()
|
||||
{
|
||||
string fileName = $"{inputPrefix.text}_{string.Format("{0:D2}", takeNumber)}.png";
|
||||
string fileName = $"{inputPrefix.text}_{takeNumber:D2}.png";
|
||||
string savePath = Path.Combine(directorySelector.selectedFolderPath, fileName);
|
||||
|
||||
Shot(selectMonitor.rcMonitor.left, selectMonitor.rcMonitor.top, selectWidth, selectHeight, savePath);
|
||||
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
||||
ShotWin(selectMonitor.rcMonitor.left, selectMonitor.rcMonitor.top, selectWidth, selectHeight, savePath);
|
||||
#elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
|
||||
ShotMac(savePath);
|
||||
#endif
|
||||
inputResult.text = savePath;
|
||||
takeNumber++;
|
||||
}
|
||||
|
||||
void Shot(int x, int y, int width, int height, string savePath)
|
||||
// Windows 캡처 로직
|
||||
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
||||
void ShotWin(int x, int y, int width, int height, string savePath)
|
||||
{
|
||||
IntPtr desktopDC = GetDC(IntPtr.Zero);
|
||||
IntPtr memoryDC = CreateCompatibleDC(desktopDC);
|
||||
IntPtr bitmap = CreateCompatibleBitmap(desktopDC, width, height);
|
||||
IntPtr oldBitmap = SelectObject(memoryDC, bitmap);
|
||||
|
||||
BitBlt(memoryDC, 0, 0, width, height, desktopDC, x, y, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);
|
||||
// 0x00CC0020 = SRCCOPY, 0x40000000 = CAPTUREBLT
|
||||
BitBlt(memoryDC, 0, 0, width, height, desktopDC, x, y, 0x00CC0020 | 0x40000000);
|
||||
|
||||
using (Bitmap bmp = Image.FromHbitmap(bitmap))
|
||||
{
|
||||
bmp.Save(savePath, ImageFormat.Png);
|
||||
}
|
||||
|
||||
// 정리
|
||||
SelectObject(memoryDC, oldBitmap);
|
||||
DeleteObject(bitmap);
|
||||
DeleteDC(memoryDC);
|
||||
ReleaseDC(desktopDC, memoryDC);
|
||||
|
||||
inputResult.text = savePath;
|
||||
ReleaseDC(IntPtr.Zero, desktopDC);
|
||||
}
|
||||
#endif
|
||||
|
||||
// macOS 캡처 로직
|
||||
#if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
|
||||
void ShotMac(string savePath)
|
||||
{
|
||||
// macOS는 시스템 명령어를 통해 스크린샷을 찍는 것이 가장 안정적입니다.
|
||||
// -x: 소리 없음, -C: 커서 포함(선택)
|
||||
// 만약 특정 모니터만 찍어야 한다면 -D 옵션을 사용합니다 (예: -D 1)
|
||||
string args = $"-x \"{savePath}\"";
|
||||
|
||||
try
|
||||
{
|
||||
System.Diagnostics.Process.Start("screencapture", args);
|
||||
Debug.Log($"macOS 스크린샷 저장 완료: {savePath}");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError($"macOS 스크린샷 실패: {e.Message}");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -5,7 +5,7 @@ EditorBuildSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Scenes:
|
||||
- enabled: 1
|
||||
- enabled: 0
|
||||
path: Assets/Scenes/SampleScene.unity
|
||||
guid: 8c9cfa26abfee488c85f1582747f6a02
|
||||
m_configObjects:
|
||||
|
||||
@@ -12,16 +12,16 @@ PlayerSettings:
|
||||
targetDevice: 2
|
||||
useOnDemandResources: 0
|
||||
accelerometerFrequency: 60
|
||||
companyName: DefaultCompany
|
||||
productName: ScreenCapture
|
||||
companyName: Cooney Studio
|
||||
productName: Screen Capture
|
||||
defaultCursor: {fileID: 0}
|
||||
cursorHotspot: {x: 0, y: 0}
|
||||
m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
|
||||
m_SplashScreenBackgroundColor: {r: 0.8, g: 0.8, b: 0.8, a: 1}
|
||||
m_ShowUnitySplashScreen: 1
|
||||
m_ShowUnitySplashLogo: 1
|
||||
m_SplashScreenOverlayOpacity: 1
|
||||
m_SplashScreenAnimation: 1
|
||||
m_SplashScreenLogoStyle: 1
|
||||
m_SplashScreenLogoStyle: 0
|
||||
m_SplashScreenDrawMode: 0
|
||||
m_SplashScreenBackgroundAnimationZoom: 1
|
||||
m_SplashScreenLogoAnimationZoom: 1
|
||||
@@ -42,8 +42,8 @@ PlayerSettings:
|
||||
m_SplashScreenLogos: []
|
||||
m_VirtualRealitySplashScreen: {fileID: 0}
|
||||
m_HolographicTrackingLossScreen: {fileID: 0}
|
||||
defaultScreenWidth: 1920
|
||||
defaultScreenHeight: 1080
|
||||
defaultScreenWidth: 480
|
||||
defaultScreenHeight: 320
|
||||
defaultScreenWidthWeb: 960
|
||||
defaultScreenHeightWeb: 600
|
||||
m_StereoRenderingPath: 0
|
||||
@@ -83,7 +83,7 @@ PlayerSettings:
|
||||
androidApplicationEntry: 2
|
||||
defaultIsNativeResolution: 1
|
||||
macRetinaSupport: 1
|
||||
runInBackground: 0
|
||||
runInBackground: 1
|
||||
muteOtherAudioSources: 0
|
||||
Prepare IOS For Recording: 0
|
||||
Force IOS Speakers When Recording: 0
|
||||
@@ -91,7 +91,7 @@ PlayerSettings:
|
||||
deferSystemGesturesMode: 0
|
||||
hideHomeButton: 0
|
||||
submitAnalytics: 1
|
||||
usePlayerLog: 1
|
||||
usePlayerLog: 0
|
||||
dedicatedServerOptimizations: 1
|
||||
bakeCollisionMeshes: 0
|
||||
forceSingleInstance: 0
|
||||
@@ -107,8 +107,8 @@ PlayerSettings:
|
||||
xboxEnableKinectAutoTracking: 0
|
||||
xboxEnableFitness: 0
|
||||
visibleInBackground: 1
|
||||
allowFullscreenSwitch: 1
|
||||
fullscreenMode: 1
|
||||
allowFullscreenSwitch: 0
|
||||
fullscreenMode: 3
|
||||
xboxSpeechDB: 0
|
||||
xboxEnableHeadOrientation: 0
|
||||
xboxEnableGuest: 0
|
||||
|
||||
Reference in New Issue
Block a user