146 lines
4.6 KiB (Stored with Git LFS)
C#
146 lines
4.6 KiB (Stored with Git LFS)
C#
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;
|
|
}
|
|
}
|
|
} |