카메라 기능 개발

This commit is contained in:
정영민
2025-03-14 09:21:26 +09:00
parent a92138fe89
commit 242635497f
8 changed files with 321 additions and 102 deletions

View File

@@ -26,18 +26,18 @@ MonoBehaviour:
_elevationRotateLimit: 0
_isFirstPersonView: 0
originElevation: 28.5
currentElevation: 90
currentElevation: 28.5
elevationSensivity: 15
minElevation: 5
maxElevation: 90
originAzimuth: 133
currentAzimuth: 89.75
currentAzimuth: 133
azimuthSensivity: 15
maxDistance: 150
minDistance: 5
moveClamper: 0.033333335
moveClamper: 1
originDistance: 120
originTargetPos: {x: -37.685005, y: 27, z: 29.893412}
originTargetRot: {x: -0, y: 0, z: 0}
currentDistance: 115.012886
currentDistance: 150
target: {fileID: 0}

View File

@@ -0,0 +1,15 @@
namespace WI
{
[System.Serializable]
public class CameraEntity
{
public float x;
public float y;
public float z;
public float distance;
public float elevation;
public float azimuth;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: db7ea094b0ebba741893718f5fbfcbaa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
@@ -9,6 +10,8 @@ namespace WI
public class OrbitalController : GenericController, ISingle, IOptionable
{
public new OrbitalControllerOption option => base.option as OrbitalControllerOption;
public SDictionary<ViewMode, CameraEntity> saveTargetPositions = new SDictionary<ViewMode, CameraEntity>();
public Action<int> ZoomInOutEvent;
public int maxValue;
public float duration_MoveToCamera;
@@ -59,6 +62,12 @@ namespace WI
base.AfterAwake();
targetColliderRadius = option.target.GetComponent<SphereCollider>().radius;
foreach(ViewMode mode in Enum.GetValues(typeof(ViewMode)))
{
saveTargetPositions.Add(mode, null);
}
SetViewMode(ViewMode.PerspectiveView);
}
public override void AfterStart()
@@ -379,28 +388,55 @@ namespace WI
}
public void CameraTopView()
{
var saveData = saveTargetPositions[ViewMode.TopView];
option.maxDistance = 35f;
option.currentElevation = 90f;
option.currentDistance = 35f;
option.currentAzimuth = 0f;
if (saveData == null)
{
option.currentElevation = 90f;
option.currentDistance = 35f;
option.currentAzimuth = 0f;
}
else
{
SetCameraData(viewMode);
}
LastPositioning(true);
}
public void CameraFirstPersonView()
{
camera.transform.position = option.target.position;
option.currentDistance = 5f;
option.currentElevation = 0f;
option.currentAzimuth = 0f;
var saveData = saveTargetPositions[ViewMode.FirstPersonView];
if (saveData == null)
{
camera.transform.position = option.target.position;
option.currentDistance = 5f;
option.currentElevation = 0f;
option.currentAzimuth = 0f;
}
else
{
SetCameraData(viewMode);
}
LastPositioning(true);
}
public void CameraPerspectiveView()
{
var saveData = saveTargetPositions[ViewMode.PerspectiveView];
option.maxDistance = 150f;
option.currentDistance = option.originDistance;
option.currentAzimuth = option.originAzimuth;
option.currentElevation = option.originElevation;
if (saveData == null)
{
option.currentDistance = option.originDistance;
option.currentAzimuth = option.originAzimuth;
option.currentElevation = option.originElevation;
}
else
{
SetCameraData(viewMode);
}
LastPositioning(true);
}
@@ -438,5 +474,27 @@ namespace WI
onFirstPersonViewRay?.Invoke(hit);
}
}
public void SaveTargetPosition()
{
var cameraEntity = new CameraEntity();
cameraEntity.x = option.target.position.x;
cameraEntity.y = option.target.position.y;
cameraEntity.z = option.target.position.z;
cameraEntity.distance = option.currentDistance;
cameraEntity.azimuth = option.currentAzimuth;
cameraEntity.elevation = option.currentElevation;
saveTargetPositions[viewMode] = cameraEntity;
}
private void SetCameraData(ViewMode currentViewMode)
{
var cameraData = saveTargetPositions[currentViewMode];
nextPosition = new Vector3(cameraData.x, cameraData.y, cameraData.z);
Debug.Log(nextPosition);
option.currentDistance = cameraData.distance;
option.currentAzimuth = cameraData.azimuth;
option.currentElevation = cameraData.elevation;
}
}
}