本篇教程制作的小地图是不动的。若要学习人物坐标不动、地图动的小地图,请查看[自定义小地图系统]。
效果展示:

首先我们应根据小地图的大小定义小地图和世界的比例。
先做出场景:

再根据需求,计算出小地图与世界的比例,在UI编辑中做出小地图:
(小地图范围长度240,高度400;世界中场景长度15,高度25。小地图与世界比例为16:1,小地图遵循上北下南左西右东)

添加玩家的箭头,注意:玩家的箭头需要根据玩家朝向旋转的,而UI编辑中元件旋转是以左上角为旋转中心旋转的。所以我们应先添加一个长宽为0的元件,再把表示玩家的箭头设为它的子元件,让它在箭头的中心位置。这样旋转长宽为0的元件就可以实现让箭头围绕中心旋转。

触发器
小地图需要每刻刷新,先添加0.05秒运行的事件,然后对所有玩家运行(具体根据需求)。

刷新箭头需刷新箭头位置和旋转角度。

设置箭头位置
箭头位置用小地图与世界的比例计算。
我们先算出玩家位置与场景边界的长度,再乘比例。(这里是西边的边界,左标x是-194)

设置元件的y值要注意,元件的值相当于世界中的z值。而且y值是向下递增的,而世界中则是向北(上)递增的。所以计算后还需要用小地图的高度减掉。

设置箭头旋转角度
我们需要先获取玩家面向的角度,再进行计算。
由于玩家面向的角度以面向南为0(面向z轴为0),所以需要先用180减去面向角度。
并且面向角度是逆时针递增的,所以还需乘-1。

脚本
local uiid=[[7129764931936418930]]--UIID
local eleid=[[7129764931936418930_9]]
local function change()
local ret1, num, arr = World:getAllPlayers(-1)
for _, objid in pairs(arr)do
local ret2, x, y, z = Actor:getPosition(objid)
local ret3, yaw = Actor:getFaceYaw(objid)
Customui:setPosition(objid,uiid,eleid,(x+194)*16,400-(z-20)*16)
Customui:rotateElement(objid,uiid,eleid,-1*(180-Yaw))
end
end
ScriptSupportEvent:registerEvent("Game.Run",function()
local a, b = pcall(change)
if not(a) then
Chat:sendSystemMsg("#R脚本错误:"..b)
error(b)
end
end)