ProjectDDD/Packages/SLUnity/UnitSytem/Components/MoveController.cs

146 lines
4.6 KiB
C#
Raw Normal View History

using System;
using Superlazy;
using UnityEngine;
[ComponentOrder(1000)]
public class MoveController : UnitComponent
{
public override void Begin(Unit unit, SLEntity component)
{
if (unit.Entity["AngularSpeed"] == false)
{
unit.Entity["AngularSpeed"] = SLSystem.Data["Default"]["AngularSpeed"];
}
}
public override void End(Unit unit, SLEntity component)
{
unit.Entity["CurrentMoveSpeed"] = false;
unit.Entity["To"] = false;
unit.Entity["MoveStop"] = false;
}
public override void Update(Unit unit, SLEntity component)
{
if (unit.Entity.HasChild("MoveStop"))
{
unit.Entity["MoveStop"] -= 1;
if (unit.Entity["MoveStop"] <= 0) unit.Entity["MoveStop"] = false;
return;
}
// TODO: 이럴거면 그냥 컴포넌트 순서로?
if (unit.Zone.Entity.HasChild("MoveCheck"))
{
if (unit.Entity.HasChild("To") && unit.Entity.HasChild("MoveSpeed") && unit.Entity.HasChild("ZoneMoveCheck"))
{
var moveContext = SLEntity.Empty;
moveContext["Handle"] = unit.Entity["Handle"];
moveContext["Position"] = unit.Entity["Position"];
UpdateMove(unit);
unit.Zone.Message("MoveCheck", moveContext);
}
else
{
UpdateMove(unit);
}
}
else
{
UpdateMove(unit);
}
}
private void UpdateMove(Unit unit)
{
if (unit.Entity.HasChild("To") == false) return;
if (unit.Entity.HasChild("MoveSpeed") == false) return;
var position = unit.Entity["Position"].ToVector3();
var to = unit.Entity["To"].ToVector3();
var dir = to - position;
var dist = dir.magnitude;
var move = true;
if (unit.Entity.HasChild("AngularSpeed") && unit.Entity.HasChild("ForwardLock") == false)
{
var planeDir = dir;
planeDir.y = 0;
if (planeDir.sqrMagnitude >= 0.1f)
{
var fromRot = Quaternion.LookRotation(unit.Entity["Forward"].ToVector3());
var toRot = Quaternion.LookRotation(planeDir);
var newForward = Quaternion.RotateTowards(fromRot, toRot, unit.Entity["AngularSpeed"] * 0.0166666666666666666666666666667f) * Vector3.forward;
if (Vector3.Dot(planeDir.normalized, newForward) < 0.99f)
{
move = false;
unit.Entity["Forward"] = newForward.ToEntity();
}
}
}
if (move == false) return;
float moveDelta;
if (unit.Entity.HasChild("Acceleration"))
{
if (dist < unit.Entity["CurrentMoveSpeed"] * unit.Entity["CurrentMoveSpeed"] / unit.Entity["Acceleration"] * 0.5f)
{
unit.Entity["CurrentMoveSpeed"] -= unit.Entity["Acceleration"] * 0.0166666666666666666666666666667f;
}
else
{
unit.Entity["CurrentMoveSpeed"] += unit.Entity["Acceleration"] * 0.0166666666666666666666666666667f;
}
if (unit.Entity["CurrentMoveSpeed"] > unit.Entity["MoveSpeed"])
{
unit.Entity["CurrentMoveSpeed"] = unit.Entity["MoveSpeed"];
}
moveDelta = unit.Entity["CurrentMoveSpeed"] * 0.0166666666666666666666666666667f;
}
else
{
moveDelta = unit.Entity["MoveSpeed"] * 0.0166666666666666666666666666667f;
}
if (dist < moveDelta || moveDelta <= 0)
{
unit.Entity["Position"] = unit.Entity["To"];
unit.Entity["To"] = false;
unit.Entity["CurrentMoveSpeed"] = false;
}
else
{
unit.Entity["Position"] = (position + dir.normalized * moveDelta).ToEntity();
}
if (unit.Entity.HasChild("ForwardLock") == false)
{
dir.y = 0;
if (dir.sqrMagnitude > 0.0001)
{
unit.Entity["Forward"] = dir.ToEntity();
}
if (unit.Entity["Forward"].ToVector3().Equals(Vector3.zero))
{
SLLog.Error("Forward is y-axis. Need ForwardLock");
}
}
}
public void OnEndUpdate(Unit unit, SLEntity component, SLEntity context)
{
if (unit.Entity.HasChild("MovePosition"))
{
unit.Entity["Position"] = unit.Entity["MovePosition"];
unit.Entity["MovePosition"] = false;
}
}
}