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; } } }