つかいかた
メニューの Extension -> Sequence Screenshot を選択すると上の画面が開きます。あとはゲームの再生中に「Capture Start」を押すと連続でスクリーンショットを撮ってくれます。
ボタンとゲーム再生の手順は逆でもOKです
Start Capture / Stop Capture
撮影の開始と終了を指示するボタンです。
Output Folder
キャプチャ画像の出力先フォルダのパスです。
下の「Select Folder」ボタンでフォルダ選択ウィンドウが開きます。
Filename Prefix
キャプチャ画像のファイル名の前につける文字列です。
Filename Suffix
キャプチャ画像のファイル名の後につける文字列です。
Interval
撮影の時間間隔です。単位は秒。
例えば、5を指定すると5秒おきにキャプチャされます。
Max Capture Count
最大撮影枚数です。0以下を指定すると無限に撮影し続けます。
指定された枚数の撮影が終わると自動的に「Stop Capture」が押された状態になります。
Identify Method
撮影されたスクリーンショットを識別する方法です。
- 「Timestamp」ファイル名にタイムスタンプを使用します。
- 「SerialNumber」ファイル名に連番を振ります
Timestamp Format
ファイル名にタイムスタンプを使用するとき、タイムスタンプの形式を指定します。
Offset
ファイル名に連番を使用するとき、最初の番号を指定します。
Reset Serial Number
押すと次に振られる連番の番号を「Offset」の番号に変更します。
Current Serial Number
次に振られる連番の番号です。
Filename Sample
ファイル名はだいたいこんな感じになるよーっていう見本です。
ソースコードはこちら。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
SequenceScreenshot.cs | |
Copyright (c) 2016 Hassaku | |
This software is released under the MIT License. | |
http://opensource.org/licenses/mit-license.php | |
*/ | |
using UnityEngine; | |
using UnityEditor; | |
/// <summary> | |
/// 連続でスクリーンショットを撮りまくるエディタ拡張 | |
/// </summary> | |
public class SequenceScreenshot : EditorWindow { | |
/// <summary> | |
/// スクリーンショットの区別方法 | |
/// </summary> | |
private enum IdentifyMethod { | |
Timestamp, // タイムスタンプで識別 | |
SerialNumber, // 連番で識別 | |
} | |
private const string directoryPathKey = "SequenceScreenshot_DirectoryPath"; | |
private const string filenamePrefixKey = "SequenceScreenshot_FilenamePrefix"; | |
private const string filenameSuffixKey = "SequenceScreenshot_FilenameSuffix"; | |
private const string intervalKey = "SequenceScreenshot_Interval"; | |
private const string maxCaptureCountKey = "SequenceScreenshot_MaxCaptureCount"; | |
private const string identifyMethodKey = "SequenceScreenshot_IdentifyMethod"; | |
private const string timestampFormatKey = "SequenceScreenshot_TimestampFormat"; | |
private const string serialNumberKey = "SequenceScreenshot_SerialNumber"; | |
private const string serialNumberOffsetKey = "SequenceScreenshot_SerialNumberOffset"; | |
private const string windowTitle = "Screenshot"; | |
private readonly Vector2 bigButtonSize = new Vector2(200, 40); | |
private const float smallButtonHeight = 30; | |
private const string startButtonLabel = "Capture Start"; | |
private const string stopButtonLabel = "Capture Stop"; | |
private bool isStarted = false; | |
private string directoryPath; | |
private string filenamePrefix; | |
private string filenameSuffix; | |
private float interval; | |
private int maxCaptureCount; | |
private IdentifyMethod identifyMethod; | |
private string timestampFormat; | |
private int serialNumber; | |
private int serialNumberOffset; | |
private string filenameSample; | |
private bool captureStarted = false; | |
private double previousTime; | |
private double accumeTime = 0.0; | |
private int captureCount; | |
/// <summary> | |
/// メニューを選択した時ウィンドウを開く | |
/// </summary> | |
[MenuItem("Extension/Sequence Screenshot")] | |
static void OpenWindow() { | |
// ウィンドウを開く | |
GetWindow<SequenceScreenshot>(windowTitle); | |
} | |
void OnGUI() { | |
if (isStarted) { | |
// ストップボタン | |
if (GUILayout.Button(stopButtonLabel, GUILayout.Width(bigButtonSize.x), GUILayout.Height(bigButtonSize.y))) { | |
isStarted = false; | |
} | |
} | |
else { | |
// スタートボタン | |
if (GUILayout.Button(startButtonLabel, GUILayout.Width(bigButtonSize.x), GUILayout.Height(bigButtonSize.y))) { | |
isStarted = true; | |
captureStarted = false; | |
} | |
} | |
EditorGUILayout.Space(); | |
EditorGUILayout.LabelField("Output Folder", directoryPath); | |
if (GUILayout.Button("Select Folder", GUILayout.Height(smallButtonHeight))) { | |
directoryPath = EditorUtility.OpenFolderPanel("Select Folder", Application.dataPath, ""); | |
} | |
filenamePrefix = EditorGUILayout.TextField("Filename Prefix", filenamePrefix); | |
filenameSuffix = EditorGUILayout.TextField("Filename Suffix", filenameSuffix); | |
EditorGUILayout.Space(); | |
interval = EditorGUILayout.FloatField("Capture Interval", interval); | |
maxCaptureCount = EditorGUILayout.IntField("Max Capture Count", maxCaptureCount); | |
EditorGUILayout.Space(); | |
identifyMethod = (IdentifyMethod)EditorGUILayout.EnumPopup("Identify Method", identifyMethod); | |
switch (identifyMethod) { | |
case IdentifyMethod.Timestamp: | |
timestampFormat = EditorGUILayout.TextField("Format", timestampFormat); | |
filenameSample = filenamePrefix + timestampFormat + filenameSuffix; | |
break; | |
case IdentifyMethod.SerialNumber: | |
serialNumberOffset = EditorGUILayout.IntField("Offset", serialNumberOffset); | |
if (GUILayout.Button("Reset Serial Number", GUILayout.Height(smallButtonHeight))) { | |
serialNumber = serialNumberOffset; | |
} | |
EditorGUILayout.LabelField("Current Serial Number", serialNumber.ToString()); | |
filenameSample = filenamePrefix + serialNumber.ToString() + filenameSuffix; | |
break; | |
} | |
EditorGUILayout.Space(); | |
EditorGUILayout.LabelField("Filename Sample", filenameSample); | |
if (!System.IO.Directory.Exists(directoryPath)) { | |
EditorGUILayout.HelpBox("Folder \"" + directoryPath + "\" is not exist.", MessageType.Error); | |
} | |
} | |
/// <summary> | |
/// 表示している間毎フレーム呼び出される | |
/// </summary> | |
void Update() { | |
if (!isStarted || !EditorApplication.isPlaying) return; | |
if (!System.IO.Directory.Exists(directoryPath)) return; | |
if (!captureStarted) { | |
previousTime = EditorApplication.timeSinceStartup; | |
accumeTime = 0.0; | |
captureCount = 0; | |
captureStarted = true; | |
} | |
double time = EditorApplication.timeSinceStartup; | |
accumeTime += time - previousTime; | |
previousTime = time; | |
if(accumeTime >= interval) { | |
string filename = string.Empty; | |
switch (identifyMethod) { | |
case IdentifyMethod.Timestamp: | |
string timestamp = System.DateTime.Now.ToString(timestampFormat); | |
filename = directoryPath + "/" + filenamePrefix + timestamp + filenameSuffix; | |
break; | |
case IdentifyMethod.SerialNumber: | |
filename = directoryPath + "/" + filenamePrefix + serialNumber + filenameSuffix; | |
++serialNumber; | |
break; | |
} | |
Application.CaptureScreenshot(filename); | |
++captureCount; | |
EditorPrefs.SetInt(serialNumberKey, serialNumber); | |
if (maxCaptureCount > 0 && captureCount >= maxCaptureCount) isStarted = false; | |
accumeTime -= interval; | |
Repaint(); | |
} | |
} | |
void OnFocus() { | |
directoryPath = EditorPrefs.GetString(directoryPathKey, EditorApplication.applicationContentsPath); | |
filenamePrefix = EditorPrefs.GetString(filenamePrefixKey, "capture_"); | |
filenameSuffix = EditorPrefs.GetString(filenameSuffixKey, ".png"); | |
interval = EditorPrefs.GetFloat(intervalKey, 5.0f); | |
maxCaptureCount = EditorPrefs.GetInt(maxCaptureCountKey, 0); | |
identifyMethod = (IdentifyMethod)System.Enum.Parse(typeof(IdentifyMethod), EditorPrefs.GetString(identifyMethodKey, IdentifyMethod.Timestamp.ToString())); | |
timestampFormat = EditorPrefs.GetString(timestampFormatKey, "yyyy-MM-dd_hh-mm-ss"); | |
serialNumberOffset = EditorPrefs.GetInt(serialNumberOffsetKey, 0); | |
serialNumber = EditorPrefs.GetInt(serialNumberKey, serialNumberOffset); | |
} | |
/// <summary> | |
/// フォーカスを失った時 | |
/// </summary> | |
void OnLostFocus() { | |
EditorPrefs.SetString(directoryPathKey, directoryPath); | |
EditorPrefs.SetString(filenamePrefixKey, filenamePrefix); | |
EditorPrefs.SetString(filenameSuffixKey, filenameSuffix); | |
EditorPrefs.SetFloat(intervalKey, interval); | |
EditorPrefs.SetInt(maxCaptureCountKey, maxCaptureCount); | |
EditorPrefs.SetString(identifyMethodKey, identifyMethod.ToString()); | |
EditorPrefs.SetString(timestampFormatKey, timestampFormat); | |
EditorPrefs.SetInt(serialNumberKey, serialNumber); | |
EditorPrefs.SetInt(serialNumberOffsetKey, serialNumberOffset); | |
} | |
/// <summary> | |
/// ウィンドウが閉じられるとき呼び出される | |
/// </summary> | |
void OnDestroy() { | |
EditorPrefs.SetString(directoryPathKey, directoryPath); | |
EditorPrefs.SetString(filenamePrefixKey, filenamePrefix); | |
EditorPrefs.SetString(filenameSuffixKey, filenameSuffix); | |
EditorPrefs.SetFloat(intervalKey, interval); | |
EditorPrefs.SetInt(maxCaptureCountKey, maxCaptureCount); | |
EditorPrefs.SetString(identifyMethodKey, identifyMethod.ToString()); | |
EditorPrefs.SetString(timestampFormatKey, timestampFormat); | |
EditorPrefs.SetInt(serialNumberKey, serialNumber); | |
EditorPrefs.SetInt(serialNumberOffsetKey, serialNumberOffset); | |
} | |
} |
0 件のコメント:
コメントを投稿