Hello, guys! So, I make an eye mechanism with GUI, which is a drag knob that converts orientation to position (because of 2D so, I will make plane constraints). I have scripted it, but it doesn’t appear in GUI when clicked on the hitbox.
So, watch an example of a video:
An Example Video
There is an example of a script also:
local mainModel = script.Parent
local faceGui = script:WaitForChild("BrandNewEyesRotatorGui")
local Click = mainModel.HitBox:WaitForChild("ClickDetector")
local remote = mainModel:WaitForChild("Remote")
local controlledBy = mainModel:WaitForChild("ControlledBy")
local defaultPositionAxis = Vector3.new(0, 0, 0)
local XPositionLimit = 0
local YPositionLimit = 0
local hadScannedAxes = false
local debounce = true
local guiEvent = nil
local XAxes = {}
local YAxes = {}
local function scanAxes(FaceModel)
local XTable = {}
local YTable = {}
for _, attachment in pairs(FaceModel:GetDescendants()) do
if attachment:IsA("Attachment") then
if attachment.Name == "XAxisMain" then
table.insert(XTable, attachment)
end
if attachment.Name == "YAxisMain" then
table.insert(YTable, attachment)
end
end
end
return XTable, YTable
end
local function calculatePosition(XLimit, YLimit, XPos, YPos)
local XPositionCFrame = XPos * XLimit
local YPositionCFrame = YPos * YLimit
local XPosition = defaultPositionAxis + Vector3.new(XPositionCFrame, 0, 0)
local YPosition = defaultPositionAxis + Vector3.new(0, YPositionCFrame, 0)
return XPosition, YPosition
end
local function calculateGUIPosition(XLimit, YLimit, XPosition, YPosition)
local XPositionCFrame = (XPosition - defaultPositionAxis).Y
local YPositionCFrame = -((YPosition - defaultPositionAxis).Z)
local XPos = XPositionCFrame / XLimit
local YPos = YPositionCFrame / YLimit
return XPos, YPos
end
local function repositionEyes(XPos, YPos)
local XPosition, YPosition = calculatePosition(XPositionLimit, YPositionLimit, XPos, YPos)
for _, Axis in pairs(XAxes) do
Axis.Position = XPosition
end
for _, Axis in pairs(YAxes) do
Axis.Position = YPosition
end
end
local function GUIClosed()
if controlledBy.Value ~= nil then
print("Closing control from " .. controlledBy.Value.Name .."...")
controlledBy.Value = nil
else
print("Unused Controller")
end
end
local function toggled(Player)
if debounce == true then
if controlledBy.Value == nil then
debounce = false
local playerGUI = Player:FindFirstChild("PlayerGui")
local existingFaceGUI = playerGUI:FindFirstChild(faceGui.Name)
if existingFaceGUI == nil then
print("Face controller toggled.")
controlledBy.Value = Player
XAxes, YAxes = scanAxes(mainModel)
local GUIClone = faceGui:Clone()
GUIClone.Parent = playerGUI
local remoteReference = GUIClone:FindFirstChild("RemoteEventReference")
remoteReference.Value = remote
guiEvent = GUIClone.Changed:Connect(function()
if not GUIClone:IsDescendantOf(game) then
GUIClosed()
guiEvent:Disconnect()
print("Disconnected")
end
end)
else
print(Player.Name .. "is controlling another face of the other engines.")
end
debounce = true
else
print("Already controlled by ".. controlledBy.Value.Name)
end
end
end
local function onRemote(Player, Func, FuncFaceModel, ...)
if FuncFaceModel == mainModel then
if Func == "AskForPosition" then
if #XAxes > 0 and #YAxes > 0 then
local XPosition = nil
local YPosition = nil
for _, Axis in pairs(XAxes) do
XPosition = Axis.Position
break
end
for _, Axis in pairs(YAxes) do
YPosition = Axis.Position
break
end
local XPos, YPos = calculateGUIPosition(XPositionLimit, YPositionLimit, XPosition, YPosition)
remote:FireAllClients("GUIReposition", FuncFaceModel, (XPos / 2) + 0.5, (YPos / 2) + 0.5)
else
remote:FireAllClients("RequestCloseGUI", mainModel)
end
end
if Func == "RepositionEyes" then
if #XAxes > 0 and #YAxes > 0 then
repositionEyes(...)
else
remote:FireAllClients("RequestCloseGUI", mainModel)
end
end
if Func == "GUIClosed" then
GUIClosed()
end
end
end
Click.MouseClick:Connect(toggled)
remote.OnServerEvent:Connect(onRemote)
So, I want to script that GUI appeared when clicked on. How do I make it?