Files
Studio/Assets/Scripts/Studio/TwinObject/DynamicObject/AGV.cs
geondo55 7006c70270 백업
2025-05-26 17:41:54 +09:00

139 lines
3.8 KiB
C#

using Studio.VirtualFactory;
using System;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using Studio.VirtualFactory.Info;
namespace Studio.Dynamic.TwinObject
{
public class AGV : MonoBehaviour, IInfo
{
float dp;
Vector3 nextPos;
float startX;
float endX;
float startY;
float endY;
float rotSpeed;
float moveSpeed;
float xp;
float yp;
Vector3 endPos;
Quaternion startRot;
Quaternion endRot;
public Dictionary<string, string> CurrentEntity;
private bool isPlay = false;
public Dictionary<string, string> Info {
get
{
//ToDo 보고싶은 정보 나열한.. 리스트 목록 가져온다..
return CurrentEntity;
}
}
public Dictionary<string, string> Label {
get
{
//ToDo 보고싶은 정보 나열한.. 리스트 목록 가져온다..
return CurrentEntity;
}
}
public void Init(string type,Vector3 pos)
{
transform.position = pos;
startX = transform.position.x;
startY = transform.position.z;
endX = transform.position.x;
endY = transform.position.z;
startRot = Quaternion.identity;
endRot = Quaternion.identity;
isPlay = true;
StudioService.instance.AddTypeIdListener(type, transform.name, OnUpdateData);
}
internal void OnUpdateData(object sender, StudioServiceIdEventArgs e)
{
CurrentEntity = e.Entity;
var s = "{";
foreach(var t in e.Entity)
{
s += $"{t.Key}: {t.Value},";
}
s += "}";
//Debug.Log(s);
SetPos();
}
private void SetPos()
{
dp = 0f;
xp = 0f;
yp = 0f;
var xpos = CurrentEntity.FirstOrDefault(x => x.Key.Equals("x", StringComparison.OrdinalIgnoreCase));
var ypos = CurrentEntity.FirstOrDefault(x => x.Key.Equals("y", StringComparison.OrdinalIgnoreCase));
var x = float.Parse(xpos.Value) * 0.001f;
var z = float.Parse(ypos.Value) * 0.001f;
endPos = new Vector3(x, transform.position.y, z);
startX = transform.position.x;
startY = transform.position.z;
endX = endPos.x;
endY = endPos.z;
//노드방향으로 회전값알기
var degree =CurrentEntity.FirstOrDefault(x => x.Key.Equals("DEGREE", StringComparison.OrdinalIgnoreCase));
var deg = float.Parse(degree.Value);
deg = 360f - deg;
startRot = transform.rotation;
endRot = Quaternion.AngleAxis(deg, Vector3.up);
}
void PerforcedRotation()
{
if (dp >= 1f)
return;
dp += Time.deltaTime * rotSpeed;
transform.rotation = Quaternion.Lerp(startRot, endRot, dp);
}
private void Update()
{
if (isPlay == false)
return;
PerforcedMovement();
PerforcedRotation();
}
void PerforcedMovement()
{
xp += Time.deltaTime * moveSpeed;
yp += Time.deltaTime * moveSpeed;
var nx = Mathf.Lerp(startX, endX, xp);
var ny = Mathf.Lerp(startY, endY, yp);
nextPos = new Vector3(nx, 0, ny);
transform.position = nextPos;
}
public void SetMoveSpeed(float speed)
{
moveSpeed = speed;
}
public void SetRotateSpeed(float aGVRotateSpeed)
{
rotSpeed = aGVRotateSpeed;
}
}
}