434 lines
9.7 KiB
C#
434 lines
9.7 KiB
C#
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using System.IO;
|
|||
|
|
using System;
|
|||
|
|
using UnityEngine.UI;
|
|||
|
|
using System.Linq;
|
|||
|
|
|
|||
|
|
public class cameraCaptureSystem : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
[Header ("Main Settings")]
|
|||
|
|
[Space]
|
|||
|
|
|
|||
|
|
public bool useScreenResolution;
|
|||
|
|
public Vector2 captureResolution;
|
|||
|
|
|
|||
|
|
public Color disableButtonsColor;
|
|||
|
|
public Color originalColor;
|
|||
|
|
|
|||
|
|
[Space]
|
|||
|
|
[Header ("Debug")]
|
|||
|
|
[Space]
|
|||
|
|
|
|||
|
|
public bool galleryOpened;
|
|||
|
|
public int currentCaptureIndex;
|
|||
|
|
|
|||
|
|
[Space]
|
|||
|
|
[Header ("Components")]
|
|||
|
|
[Space]
|
|||
|
|
|
|||
|
|
public ScrollRect captureListScrollRect;
|
|||
|
|
public GameObject captureSlotPrefab;
|
|||
|
|
public Scrollbar scrollBar;
|
|||
|
|
|
|||
|
|
public GameObject expandedCaptureMenu;
|
|||
|
|
public RawImage expandedCaptureImage;
|
|||
|
|
|
|||
|
|
public Image expandButton;
|
|||
|
|
public Image deleteButton;
|
|||
|
|
|
|||
|
|
public Camera customCameraForEditorCaptures;
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool useRelativePath;
|
|||
|
|
|
|||
|
|
string captureFolderName;
|
|||
|
|
|
|||
|
|
string captureFileName;
|
|||
|
|
|
|||
|
|
string currentSaveDataPath;
|
|||
|
|
bool canDelete;
|
|||
|
|
bool canExpand;
|
|||
|
|
|
|||
|
|
List<captureButtonInfo> captureList = new List<captureButtonInfo> ();
|
|||
|
|
int previousCaptureAmountInFolder;
|
|||
|
|
const string glyphs = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|||
|
|
bool checkSettingsInitialized;
|
|||
|
|
|
|||
|
|
gameManager gameSystemManager;
|
|||
|
|
|
|||
|
|
void Start ()
|
|||
|
|
{
|
|||
|
|
if (captureSlotPrefab.activeSelf) {
|
|||
|
|
captureSlotPrefab.SetActive (false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
changeButtonsColor (false, false);
|
|||
|
|
|
|||
|
|
if (expandedCaptureMenu.activeSelf) {
|
|||
|
|
expandedCaptureMenu.SetActive (false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
setMainSettings ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void setMainSettings ()
|
|||
|
|
{
|
|||
|
|
bool mainGameManagerLocated = gameSystemManager != null;
|
|||
|
|
|
|||
|
|
if (!mainGameManagerLocated) {
|
|||
|
|
gameSystemManager = gameManager.Instance;
|
|||
|
|
|
|||
|
|
mainGameManagerLocated = gameSystemManager != null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!mainGameManagerLocated) {
|
|||
|
|
gameSystemManager = FindObjectOfType<gameManager> ();
|
|||
|
|
|
|||
|
|
gameSystemManager.getComponentInstanceOnApplicationPlaying ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
useRelativePath = gameSystemManager.useRelativePath;
|
|||
|
|
|
|||
|
|
captureFolderName = gameSystemManager.getSaveCaptureFolder ();
|
|||
|
|
|
|||
|
|
captureFileName = gameSystemManager.getSaveCaptureFileName ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void checkSettings ()
|
|||
|
|
{
|
|||
|
|
if (!checkSettingsInitialized) {
|
|||
|
|
currentSaveDataPath = getDataPath ();
|
|||
|
|
checkSettingsInitialized = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void loadCaptures ()
|
|||
|
|
{
|
|||
|
|
checkSettings ();
|
|||
|
|
|
|||
|
|
int numberOfFiles = 0;
|
|||
|
|
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo (currentSaveDataPath);
|
|||
|
|
var fileInfo = dir.GetFiles ().OrderBy (p => p.CreationTime).ToArray ();
|
|||
|
|
|
|||
|
|
//if the number of pictures has changed, reload these elements
|
|||
|
|
if (previousCaptureAmountInFolder != fileInfo.Length) {
|
|||
|
|
previousCaptureAmountInFolder = fileInfo.Length;
|
|||
|
|
|
|||
|
|
for (int i = 0; i < captureList.Count; i++) {
|
|||
|
|
Destroy (captureList [i].slotGameObject);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
captureList.Clear ();
|
|||
|
|
|
|||
|
|
foreach (FileInfo file in fileInfo) {
|
|||
|
|
|
|||
|
|
#if !UNITY_WEBPLAYER
|
|||
|
|
string currentDataFile = currentSaveDataPath + file.Name;
|
|||
|
|
|
|||
|
|
if (File.Exists (currentDataFile)) {
|
|||
|
|
|
|||
|
|
byte[] bytes = File.ReadAllBytes (currentDataFile);
|
|||
|
|
|
|||
|
|
Texture2D texture = new Texture2D ((int)captureResolution.x, (int)captureResolution.y);
|
|||
|
|
|
|||
|
|
texture.filterMode = FilterMode.Trilinear;
|
|||
|
|
|
|||
|
|
texture.LoadImage (bytes);
|
|||
|
|
|
|||
|
|
addCaptureSlot (numberOfFiles, file.Name);
|
|||
|
|
|
|||
|
|
captureList [numberOfFiles].capture.texture = texture;
|
|||
|
|
|
|||
|
|
numberOfFiles++;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
captureListScrollRect.verticalNormalizedPosition = 0.5f;
|
|||
|
|
scrollBar.value = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void getSaveButtonSelected (Button button)
|
|||
|
|
{
|
|||
|
|
currentCaptureIndex = -1;
|
|||
|
|
|
|||
|
|
bool delete = false;
|
|||
|
|
bool expand = false;
|
|||
|
|
|
|||
|
|
for (int i = 0; i < captureList.Count; i++) {
|
|||
|
|
if (captureList [i].button == button) {
|
|||
|
|
currentCaptureIndex = i;
|
|||
|
|
delete = true;
|
|||
|
|
expand = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
changeButtonsColor (delete, expand);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void addCaptureSlot (int index, string fileName)
|
|||
|
|
{
|
|||
|
|
GameObject newSlotPrefab = (GameObject)Instantiate (captureSlotPrefab, captureSlotPrefab.transform.position,
|
|||
|
|
captureSlotPrefab.transform.rotation, captureSlotPrefab.transform.parent);
|
|||
|
|
|
|||
|
|
if (!newSlotPrefab.activeSelf) {
|
|||
|
|
newSlotPrefab.SetActive (true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
newSlotPrefab.transform.localScale = Vector3.one;
|
|||
|
|
|
|||
|
|
newSlotPrefab.name = "Capture Slot " + (index + 1);
|
|||
|
|
|
|||
|
|
captureSlot newCaptureSlot = newSlotPrefab.GetComponent<captureSlot> ();
|
|||
|
|
|
|||
|
|
newCaptureSlot.captureInfo.fileName = fileName;
|
|||
|
|
|
|||
|
|
captureList.Add (newCaptureSlot.captureInfo);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void changeButtonsColor (bool delete, bool expand)
|
|||
|
|
{
|
|||
|
|
if (delete) {
|
|||
|
|
deleteButton.color = originalColor;
|
|||
|
|
} else {
|
|||
|
|
deleteButton.color = disableButtonsColor;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (expand) {
|
|||
|
|
expandButton.color = originalColor;
|
|||
|
|
} else {
|
|||
|
|
expandButton.color = disableButtonsColor;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
canDelete = delete;
|
|||
|
|
|
|||
|
|
canExpand = expand;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void openCaptureGallery ()
|
|||
|
|
{
|
|||
|
|
openOrCloseCapturesGallery (true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void closeCaptureGallery ()
|
|||
|
|
{
|
|||
|
|
openOrCloseCapturesGallery (false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void openOrCloseCapturesGallery (bool state)
|
|||
|
|
{
|
|||
|
|
galleryOpened = state;
|
|||
|
|
|
|||
|
|
if (galleryOpened) {
|
|||
|
|
loadCaptures ();
|
|||
|
|
} else {
|
|||
|
|
changeButtonsColor (false, false);
|
|||
|
|
|
|||
|
|
expandedCaptureMenu.SetActive (false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string getDataPath ()
|
|||
|
|
{
|
|||
|
|
string dataPath = "";
|
|||
|
|
|
|||
|
|
if (useRelativePath) {
|
|||
|
|
dataPath = captureFolderName;
|
|||
|
|
} else {
|
|||
|
|
dataPath = Application.persistentDataPath + "/" + captureFolderName;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!Directory.Exists (dataPath)) {
|
|||
|
|
Directory.CreateDirectory (dataPath);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dataPath += "/";
|
|||
|
|
|
|||
|
|
return dataPath;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void takeCapture (Camera currentCamera)
|
|||
|
|
{
|
|||
|
|
checkSettings ();
|
|||
|
|
|
|||
|
|
// get the camera's render texture
|
|||
|
|
RenderTexture previousRenderTexture = currentCamera.targetTexture;
|
|||
|
|
|
|||
|
|
Vector2 currentResolution = captureResolution;
|
|||
|
|
|
|||
|
|
if (useScreenResolution) {
|
|||
|
|
currentResolution = new Vector2 (Screen.currentResolution.width, Screen.currentResolution.height);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
currentCamera.targetTexture = new RenderTexture ((int)currentResolution.x, (int)currentResolution.y, 24);
|
|||
|
|
|
|||
|
|
RenderTexture rendText = RenderTexture.active;
|
|||
|
|
RenderTexture.active = currentCamera.targetTexture;
|
|||
|
|
|
|||
|
|
//render the texture
|
|||
|
|
currentCamera.Render ();
|
|||
|
|
|
|||
|
|
//create a new Texture2D with the camera's texture, using its height and width
|
|||
|
|
Texture2D cameraImage = new Texture2D ((int)currentResolution.x, (int)currentResolution.y, TextureFormat.RGB24, false);
|
|||
|
|
cameraImage.ReadPixels (new Rect (0, 0, (int)currentResolution.x, (int)currentResolution.y), 0, 0);
|
|||
|
|
cameraImage.Apply ();
|
|||
|
|
|
|||
|
|
RenderTexture.active = rendText;
|
|||
|
|
//store the texture into a .PNG file
|
|||
|
|
|
|||
|
|
#if !UNITY_WEBPLAYER
|
|||
|
|
byte[] bytes = cameraImage.EncodeToPNG ();
|
|||
|
|
|
|||
|
|
int numberOfFiles = 0;
|
|||
|
|
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo (currentSaveDataPath);
|
|||
|
|
if (dir.Exists) {
|
|||
|
|
numberOfFiles = dir.GetFiles ().Length;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
currentCamera.targetTexture = previousRenderTexture;
|
|||
|
|
RenderTexture.active = currentCamera.targetTexture;
|
|||
|
|
|
|||
|
|
string randomString = "";
|
|||
|
|
|
|||
|
|
int charAmount = UnityEngine.Random.Range (10, 20); //set those to the minimum and maximum length of your string
|
|||
|
|
for (int i = 0; i < charAmount; i++) {
|
|||
|
|
randomString += glyphs [UnityEngine.Random.Range (0, glyphs.Length)];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (File.Exists (currentSaveDataPath + captureFileName + "_" + randomString + ".png")) {
|
|||
|
|
randomString += glyphs [UnityEngine.Random.Range (0, glyphs.Length)];
|
|||
|
|
}
|
|||
|
|
//save the encoded image to a file
|
|||
|
|
System.IO.File.WriteAllBytes (currentSaveDataPath + (captureFileName + "_" + randomString + ".png"), bytes);
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void takeCaptureWithCameraEditor ()
|
|||
|
|
{
|
|||
|
|
setMainSettings ();
|
|||
|
|
|
|||
|
|
takeCapture (customCameraForEditorCaptures);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void deleteCapture ()
|
|||
|
|
{
|
|||
|
|
checkSettings ();
|
|||
|
|
|
|||
|
|
if (currentCaptureIndex != -1 && canDelete) {
|
|||
|
|
|
|||
|
|
string fileName = captureList [currentCaptureIndex].fileName;
|
|||
|
|
|
|||
|
|
if (File.Exists (currentSaveDataPath + fileName)) {
|
|||
|
|
File.Delete (currentSaveDataPath + fileName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
destroyCaptureSlot (currentCaptureIndex);
|
|||
|
|
|
|||
|
|
currentCaptureIndex = -1;
|
|||
|
|
|
|||
|
|
changeButtonsColor (false, false);
|
|||
|
|
|
|||
|
|
captureListScrollRect.verticalNormalizedPosition = 0.5f;
|
|||
|
|
|
|||
|
|
scrollBar.value = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void deleteExpandedCapture ()
|
|||
|
|
{
|
|||
|
|
checkSettings ();
|
|||
|
|
|
|||
|
|
print (currentCaptureIndex);
|
|||
|
|
|
|||
|
|
if (currentCaptureIndex != -1) {
|
|||
|
|
|
|||
|
|
string fileName = captureList [currentCaptureIndex].fileName;
|
|||
|
|
|
|||
|
|
if (File.Exists (currentSaveDataPath + fileName)) {
|
|||
|
|
File.Delete (currentSaveDataPath + fileName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
destroyCaptureSlot (currentCaptureIndex);
|
|||
|
|
|
|||
|
|
if (captureList.Count > 0) {
|
|||
|
|
if ((currentCaptureIndex + 1) < captureList.Count) {
|
|||
|
|
expandNextCapture ();
|
|||
|
|
} else {
|
|||
|
|
expandPreviousCapture ();
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
expandedCaptureMenu.SetActive (false);
|
|||
|
|
closeExpandCaptureMenu ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
captureListScrollRect.verticalNormalizedPosition = 0.5f;
|
|||
|
|
|
|||
|
|
scrollBar.value = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void expandCapture ()
|
|||
|
|
{
|
|||
|
|
if (currentCaptureIndex != -1 && canExpand) {
|
|||
|
|
expandedCaptureMenu.SetActive (true);
|
|||
|
|
|
|||
|
|
expandedCaptureImage.texture = captureList [currentCaptureIndex].capture.texture;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void expandNextCapture ()
|
|||
|
|
{
|
|||
|
|
if (galleryOpened) {
|
|||
|
|
currentCaptureIndex++;
|
|||
|
|
|
|||
|
|
if (currentCaptureIndex >= captureList.Count) {
|
|||
|
|
currentCaptureIndex = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
expandedCaptureImage.texture = captureList [currentCaptureIndex].capture.texture;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void expandPreviousCapture ()
|
|||
|
|
{
|
|||
|
|
if (galleryOpened) {
|
|||
|
|
currentCaptureIndex--;
|
|||
|
|
|
|||
|
|
if (currentCaptureIndex < 0) {
|
|||
|
|
currentCaptureIndex = captureList.Count - 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
expandedCaptureImage.texture = captureList [currentCaptureIndex].capture.texture;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void closeExpandCaptureMenu ()
|
|||
|
|
{
|
|||
|
|
changeButtonsColor (false, false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void destroyCaptureSlot (int slotIndex)
|
|||
|
|
{
|
|||
|
|
Destroy (captureList [slotIndex].slotGameObject);
|
|||
|
|
|
|||
|
|
captureList.RemoveAt (slotIndex);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void updateComponent ()
|
|||
|
|
{
|
|||
|
|
GKC_Utils.updateComponent (this);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[System.Serializable]
|
|||
|
|
public class captureButtonInfo
|
|||
|
|
{
|
|||
|
|
public GameObject slotGameObject;
|
|||
|
|
public Button button;
|
|||
|
|
public RawImage capture;
|
|||
|
|
public string fileName;
|
|||
|
|
}
|
|||
|
|
}
|