Camera
*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.
Przedmiot Camera definiuje widok świata 3D.W bieżącym doświadczeniu każdy klient ma swój własny obiekt Camera, który znajduje się w lokalnym Workspace klienta, do którego można uzyskać dostęp za pomocą właściwości Workspace.CurrentCamera.
Najważniejsze właściwości kamery są:
CFrame który reprezentuje pozycję i orientację kamery.
CameraType który jest odczytywany przez skrypty kamery doświadczenia i określa, w jaki sposób kamera powinna aktualizować każdą ramę.
CameraSubject który jest odczytywany przez skrypty kamery doświadczenia i określa, jakim obiektem kamera powinna obserwować.
FieldOfView który reprezentuje widoczny zakres świata obserwowalnego.
Focus który reprezentuje punkt, na który patrzy kamera.Ważne jest, aby ta właściwość została ustawiać, ponieważ niektóre wizualizacje będą bardziej szczegółowe i będą aktualizowane częściej w zależności od tego, jak blisko są do punktu fuzji.
Zobacz Dostosowywanie kamery po więcej informacji o tym, jak dostosować i zmodyfikować zachowanie kamery.
Przechowywanie wielu kamer
Zauważ, że zmieniając Workspace.CurrentCamera na nowy Camera, wszystkie pozostałe Cameras bezpośrednio spadające z Workspace zostaną zniszczone.Jeśli musisz przechowywać wiele kamer i wymieniać między nimi na żądanie, zaleca się przechowywanie ich w Folder lub Model w ramach Workspace, w którym pozostaną nawet po zmianie CurrentCamera.
Podsumowanie
Właściwości
The CFrame of the Camera , definiujące jego pozycję i orientację w świecie 3D.
Określa Enum.CameraType, które mają być odczytane przez skrypty kamery.
Ustawia kąt nachylenia pionowego pola widzenia kamery.
Ustawia kąt pola widzenia pionowego kamery.
Określa wartość FOV Camera , która jest niewrażliwa na zmiany rozmiaru okna widoku.
Ustawia obszar w przestrzeni 3D, który jest priorytetowany przez systemy graficzne Roblox.
Przełącza, czy kamera będzie automatycznie śledzić ruch głowy gracza za pomocą urządzenieVR.
Ustawia skalę perspektywy użytkownika na świecie przy użyciu VR.
Ustawia kąt pola widzenia kamery wzdłuż najdłuższej osi widoku.
Opisuje ujemny Z offset, w szpilkach, zbliżony do planu przecięcia kamery.
Przełącza, czy należy zastosować nachylenie i obrót z właściwością CFrame, gdy gracz używa urządzenieVR.
Wymiary bezpiecznej strefy urządzenia na klientzie Roblox.
Metody
Zwraca tablicę BaseParts, która zasłania linię widzenia między punktami rzucającymi a kamerą CFrame.
Zwraca rzeczywisty CFrame, gdzie Camera jest renderowany, uwzględniając zastosowane role i wpływ urządzeń VR.
Powraca w radiach obecny obrót, lub rotacja wokół osi Z kamery, zastosowana do Camera za pomocą SetRoll() .
Tworzy jednostkę z pozycji na ekranie (w pikselach) o określonej głębokości zorientowanej w kierunku kamery.Konta dla wstawki GUI.
Ustawia obecną rotację zastosowaną wokół osi Z kamery.
Tworzy jednostkę Ray z pozycji na oknie wizyjnym (w pikselach), o danej głębokości z Camera, skierowanej w kierunku kamery.Nie uwzględnia insetu CoreUISafeInsets .
Zwraca lokalizację ekranu i głębokość Datatype.Vector3``worldPoint i czy ten punkt znajduje się w granicach ekranu.Konta dla wstawki GUI.
Zwraca lokalizację ekranu i głębokość Datatype.Vector3``worldPoint i czy ten punkt znajduje się w granicach ekranu.Nie uwzględnia insercji interfejsu GUI.
Otrzymuje pivot z PVInstance .
Przekształca PVInstance wraz z całym jego potomkiem PVInstances tak, że osie zostaną teraz umieszczone w określonym CFrame .
Zdarzenia
Wystrzelony, gdy Camera skończył interpolować za pomocą Interpolate().
Właściwości
CFrame
Właściwość ta jest CFrame z Camera , określającą jej pozycję i orientację w świecie 3D.Zauważ, że niektóre transformacje, takie jak obrót głowy przy użyciu urządzeń VR, nie są odzwierciedlone w tej właściwości, więc powinieneś użyć GetRenderCFrame(), aby uzyskać "prawdziwy" CFrame aparatu.
Możesz przesunąć kamerę ustawiając tę właściwość. Jednak domyślne skrypty kamery również to ustawiają, więc powinieneś:
Ustaw kamerę tak, aby domyślne skrypty kamery nie aktualizowały kamery.Ta metoda jest najprostsza i zalecana w większości przypadków.
Całkowicie zastąp domyślne skrypty kamery alternatywami.Ta metoda jest zalecana tylko wtedy, gdy nie potrzebujesz żadnej domyślnej funkcjonalności kamery.
Najbardziej intuicyjny sposób pozycjonowania i orientacji Camera jest za pomocą konstruktora CFrame.lookAt().W następnym przykładzie Camera jest umieszczony w Vector3.new(0, 10, 0) i jest skierowany w kierunku Vector3.new(10, 0, 0).
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameracamera.CameraType = Enum.CameraType.Scriptablelocal pos = Vector3.new(0, 10, 0)local lookAtPos = Vector3.new(10, 0, 0)Workspace.CurrentCamera.CFrame = CFrame.lookAt(pos, lookAtPos)
Chociaż kamera może być umieszczona w sposób pokazany powyżej, możesz chcieć ją animować, aby poruszała się płynnie z jednego CFrame do drugiego.Aby to zrobić, możesz:
Ustaw pozycję/orientację kamery w każdym kadrze za pomocą RunService:BindToRenderStep() i metody CFrame:Lerp().
Stwórz i zagraj w Tween animację pozycji/orientacji kamery:
local Players = game:GetService("Players")local TweenService = game:GetService("TweenService")local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameracamera.CameraType = Enum.CameraType.Scriptablelocal player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal pos = camera.CFrame * Vector3.new(0, 20, 0)local lookAtPos = character.PrimaryPart.Positionlocal targetCFrame = CFrame.lookAt(pos, lookAtPos)local tween = TweenService:Create(camera, TweenInfo.new(2), {CFrame = targetCFrame})tween:Play()
CameraSubject
CameraSubject akceptuje różnorodne Instances skrypty kamery. Domyślne skrypty kamery reagują inaczej na dostępne ustawienia:
Domyślnie skrypty kamery podążają za lokalnym charakterem Humanoid, uwzględniając obecny stan humanoida i Humanoid.CameraOffset.
Gdy ustawiono na BasePart, skrypty kamery podążają za jej pozycją, z pionowym przesunięciem w przypadku VehicleSeats .
CameraSubject nie może zostać ustawione na nil. Spróba takiego ustawienia przywróci je do poprzedniej wartości.
Aby przywrócić CameraSubject do domyślnej wartości, ustaw ją na lokalną wartość znaku Humanoid :
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local localPlayer = Players.LocalPlayer
local camera = Workspace.CurrentCamera
local function resetCameraSubject()
if camera and localPlayer.Character then
local humanoid = localPlayer.Character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
camera.CameraSubject = humanoid
end
end
end
CameraType
Domyślne skrypty kamery Roblox mają kilka zintegrowanych zachowań.Ustawienie tej właściwości przełącza między różnymi zachowaniami Enum.CameraType.Zauważ, że niektóre typy kamer wymagają ważnego CameraSubject, aby poprawnie działać.
Domyślne skrypty kamery nie przesuną lub nie zaktualizują kamery, jeśli CameraType jest ustawione na Enum.CameraType.Scriptable.Aby uzyskać więcej informacji o pozycjonowaniu i orientowaniu kamery ręcznie, zobacz CFrame .
Dla wszystkich CameraType ustawień z wyjątkiem Enum.CameraType.Scriptable, właściwość CameraSubject reprezentuje obiekt, którego pozycja jest ustawiona na kamery Focus.
DiagonalFieldOfView
Ustawia, ile stopni w kierunku diagonalnym (od jednego kąta widoku do jego przeciwnego kąta) kamera może widzieć.Zobacz FieldOfView dla bardziej ogólnego wyjaśnienia pola widzenia.
Zauważ, że DiagonalFieldOfView reprezentuje pole widzenia, które jest widoczne przez renderowanie Camera w obszarze pełnego ekranu, które może być zakryte przez szczeliny lub przecięcia ekranu na niektórych urządzeniach.Zobacz ViewportSize dla więcej informacji.
FieldOfView
Właściwość FieldOfView (FOV) określa, ile stopni w pionowym kierunku kamera może widzieć.Właściwość ta jest ograniczona między 1 a 120 stopniami i domyślnie ustawiona na 70 .Bardzo niskie lub bardzo wysokie pola widzenia nie są zalecane, ponieważ mogą dezorientować graczy.
Zauważ, że egzekwowana jest jednolita skalowanie, co oznacza, że pionowe i poziome pole widzenia zawsze jest powiązane z relacją aspektu ekranu.
Zalecane zastosowania dla FieldOfView obejmują:
- Zmniejszanie FOV, aby uzyskać wrażenie powiększenia, na przykład podczas używania lornetki.
- Zwiększenie FOV, gdy gracz "biegnie", aby wywołać wrażenie braku kontroli.
Zauważ, że FieldOfView reprezentuje pole widzenia, które jest widoczne przez renderowanie Camera w obszarze pełnego ekranu, które może być zakryte przez szczeliny lub przecięcia ekranu na niektórych urządzeniach.Zobacz ViewportSize dla więcej informacji.
FieldOfViewMode
Przybliżenie kamery (FOV) musi zostać zaktualizowane, aby odzwierciedlić zmiany () .Wartość FieldOfViewMode określa, jaka wartość FOV zostanie utrzymana stała.
Na przykład, gdy właściwość ta jest ustawiona na Enum.FieldOfViewMode.Vertical, poziomy FOV jest aktualizowany, gdy okno jest zmieniane rozmiar, ale pionowy FOV jest utrzymywany stały.Jeśli ta właściwość jest ustawiona na Enum.FieldOfViewMode.Diagonal, oba poziome i pionowe FOV mogą zostać zmienione, aby zachować stałą diagonalną FOV.
Focus
Niektóre operacje graficzne, które wykonuje silnik, takie jak aktualizowanie oświetlenia, mogą zająć czas lub wysiłek obliczeniowy, aby ukończyć.Właściwość kamery Focus mówi silnikowi, który obszar w przestrzeni 3D należy priorytetowo wdrożyć podczas wykonywania takich operacji.Na przykład dynamiczne oświetlenie z obiektów takich jak PointLights może nie renderować się na odległości daleko od fokusa.
Domyślne skrypty kamery Roblox automatycznie ustawiają Focus na podążanie za CameraSubject (zwykle Humanoid ).Jednak nie zostanie automatycznie zaktualizowany, gdy jest ustawiony na lub gdy domyślne skrypty kamery nie są używane.W tych przypadkach powinieneś aktualizować Focus każdą ramę, używając metody RunService:BindToRenderStep() w priorytecie Enum.RenderPriority.Camera.
Focus nie ma wpływu na pozycję lub orientację kamery; patrz CFrame o tym.
HeadLocked
Przełącza, czy kamera będzie automatycznie śledzić ruch głowy gracza za pomocą urządzenieVR.Gdy true (domyślnie), silnik łączy CFrame z Enum.UserCFrame głową użytkownika, aby renderować widok gracza z uwzględnieniem śledzenia głowy.Widok zostanie wyrenderowany na następnym CFrame :
local UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScale-- Będzie to równoważne z Camera:GetRenderCFrame()local renderCFrame = camera.CFrame * headCFrame
Zaleca się nie wyłączać tej właściwości z następujących powodów:
- Gracze mogą doświadczyć choroby lokomocyjnej, jeśli nie zostanie dodane odpowiednie rozwiązanie śledzenia głowy.
- Silnik Roblox wykonuje optymalizacje opóźnień, gdy HeadLocked jest prawdą.
Zobacz także
- VRService:GetUserCFrame() który może być użyty do uzyskania CFrame głowy.
- VRService:RecenterUserHeadCFrame() który jest używany do przywrócenia głowy do obecnej pozycji i orientacji urządzenieVR.
HeadScale
HeadScale to skala perspektywy użytkownika na świat przy użyciu VR.
Rozmiar 1 ścieżki w VR wynosi 0.3 meters / HeadScale , co oznacza, że większe wartości HeadScale odpowiadają światu, który wydaje się mniejszy z perspektywy użytkownika podczas używania urządzeń VR.Na przykład część o wysokości 1 ćwieka wydaje się mieć wysokość 0,6 metra dla gracza VR z .
Właściwość ta jest automatycznie kontrolowana przez VRService.AutomaticScaling w celu zsynchronizowania perspektywy gracza z rozmiarem jego awatara.Jeśli zamierzasz kontrolować HeadScale siebie lub używać niestandardowych znaków, przełącz VRService.AutomaticScaling na Enum.VRScaling.Off.
Właściwość ta nie powinna być mylona z Humanoid.HeadScale, która jest NumberValue powiązana z Humanoid w celu kontroli jej skalowania.
MaxAxisFieldOfView
Właściwość MaxAxisFieldOfView określa, ile stopni wzdłuż najdłuższej osi widoku kamera może widzieć.
Gdy najdłuższy osi jest osią pionową, ta właściwość zachowa się podobnie do właściwości FieldOfView.Ogólnie rzecz biorąc, jest to przypadek, gdy urządzenie jest w orientacji portretowej.W orientacji krajobrazowej najdłuższy osi będzie osią poziomą; w tym przypadku właściwość opisuje poziomy pól widzenia Camera .
NearPlaneZ
Właściwość NearPlaneZ opisuje, jak daleko znajduje się bliski plan cięcia kamery, w szpilkach.Prawie równoległy plan to plan geometryczny, który znajduje się przed planem kamery CFrame.Wszystko między tym samolotem a kamerą nie zostanie wyrenderowane, tworząc widok przekroju podczas oglądania obiektów na bardzo krótkich odległościach.Wartość NearPlaneZ zmienia się w zależności od różnych platform i obecnie zawsze jest między -0.1 i -0.5.

VRTiltAndRollEnabled
Właściwość ta przełącza, czy należy zastosować nachylenie i obrót z właściwości CFrame, gdy gracz używa urządzenieVR.
Aby zapobiec chorobie lokomocyjnej, horyzont powinien pozostać na poziomie.Przesuwanie i toczenie widoku gracza podczas używania urządzenia VR może spowodować rozłączenie między przestrzenią fizyczną gracza a wirtualną przestrzenią, którą oglądają.Zmiana oczywistego kierunku w dół może spowodować, że gracze stracą równowagę lub doświadczą zawrotów głowy.
Z tych powodów ogólnie zaleca się pozostawienie tej właściwości wyłączonej, chyba że dokładnie przetestowałeś swoje doświadczenie dla tych efektów.Nawet z włączonym przechyłem i obrotem możesz chcieć zapewnić, że gracz zawsze ma stabilny referencyjny ram, tak jak wnętrze pojazdu lub podłoga, która może pomóc graczowi w ugruntowaniu się w swojej przestrzeni fizycznej.
ViewportSize
ViewportSize zwraca wymiary bezpiecznej strefy urządzenia na obecnym ekranie.Ta obszar jest prostokatem, który obejmuje obszar górnej belki Roblox, ale nie obejmuje żadnych otworów urządzeń lub cięć ekranu.Jednostki ViewportSize są jednostkami przesunięcia interfejsu Roblox, które mogą różnić się od natywnych pikseli wyświetlania.

Jak wspomniano powyżej, ViewportSize nie jest równy rozmiarowi obszaru pełnego ekranu na wyświetlaczach z przecięciami lub zagięciami.Aby uzyskać pełny rozmiar obszaru na wszystkich wyświetlaczach, możesz zapytac o właściwość AbsoluteSize właściwości ScreenGui z ustawieniem ScreenInsets na None.Zobacz Enum.ScreenInsets dla więcej informacji o tym, jak definiowane są obszary ekranu.
Wreszcie, zauważ, że ViewportSize nie jest rzeczywistą wielkością okna, którą kamera używa do renderowania (kamera renderuje w obszarze pełnego ekranu).Ponadto właściwości FieldOfView i DiagonalFieldOfView są oparte na obszarze pełnego ekranu, a nie na ViewportSize.
Aktualizacje kamery
Tylko Camera obecnie wspomniane przez Workspace.CurrentCamera aktualizuje swoje ViewportSize każdą ramę podczas kroku PreRender.Nie zostanie zaktualizowany ViewportSize wszystkich innych kamer w twoim doświadczeniu, w tym tych używanych do ViewportFrames .
Metody
GetPartsObscuringTarget
Ta metoda zwraca tablicę BaseParts, która zasłania linię widoku między pozycjami kamery CFrame i Vector3 w matrycy castPoints.Każdy Instances włączony do matrycy ignoreList zostanie pominięty, wraz z ich potomkami.
Parametr castPoints jest podany jako tablica pozycji Vector3.Zauważ, że zwrócona tablica BaseParts jest w dowolnym porządku i nie jest dostarczana dodatkowa dana odbicia.Jeśli potrzebujesz danych, takich jak pozycja trafienia, materiał trafienia lub normalna powierzchnia, powinieneś wybrać metodę WorldRoot:Raycast().
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal castPoints = {Vector3.new(0, 10, 0),Vector3.new(0, 15, 0)}local ignoreList = {}local partsObscuringTarget = camera:GetPartsObscuringTarget(castPoints, ignoreList)
Jeśli Terrain zakrywa punkt rzucania, BaseParts zakrywanie punktu rzucania między zakrywającym Terrain i punktem rzucania nie zostanie zwrócone.
Parametry
Matryca Instances, którą należy ignorować wraz z jej potomkami.
Zwroty
GetRenderCFrame
Ta metoda zwraca rzeczywistą CFrame z Camera jako jest renderowana, w tym wpływ VR (przekształcenia głowy VR nie są stosowane do właściwości CFrame, więc najlepszą praktyką jest użycie GetRenderCFrame(), aby uzyskać "prawdziwy" CFrame widok gracza).
Na przykład, gdy używa się VR, Camera jest rzeczywiście renderowany na następujących CFrame :
local UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScalerenderCFrame = camera.CFrame * headCFrame
Render kamery CFrame zostanie zmieniony tylko w celu uwzględnienia głowy, gdy właściwość HeadLocked jest prawdą.
Zwroty
GetRoll
Ta metoda zwraca, w radiach, obecny obrót zastosowany do Camera za pomocą SetRoll() .Przechył jest zdefiniowany jako rotacja wokół osi Z kamery.
Ta metoda zwraca tylko wałek zastosowany za pomocą metody SetRoll().Obrót ręcznie zastosowany do kamery CFrame nie jest uwzględniany.Aby uzyskać rzeczywisty obrót Camera, w tym obrót ręcznie zastosowany, możesz użyć następującego kodu:
local Workspace = game:GetService("Workspace")
local function getActualRoll()
local camera = Workspace.CurrentCamera
local trueUp = Vector3.new(0, 1, 0)
local cameraUp = camera:GetRenderCFrame().upVector
return math.acos(trueUp:Dot(cameraUp))
end
Zwroty
Przykłady kodu
This example, when used in a LocalScript, will retrieve the current roll of the camera in degrees. Then, if the camera roll angle is not 20 degrees, the camera roll angle is set to 20 degrees.
local currentRoll = math.deg(workspace.CurrentCamera:GetRoll()) -- Gets the current roll of the camera in degrees.
if currentRoll ~= 20 then
workspace.CurrentCamera:SetRoll(math.rad(20)) -- If the camera isn't at 20 degrees roll, the roll is set to 20 degrees.
end
ScreenPointToRay
Ta metoda tworzy jednostkę Ray z pozycji 2D na ekranie (określonej w pikselach), uwzględniając wkład GUI.Pochodzenie Ray pochodzi z równowartości 2D pozycji w świecie na danej głębokości (w studach) w odległości Vector3 od 2D pozycji Camera.
Ponieważ ta metoda rozpoznaje wstawienie GUI, odliczany jest odległość zastosowany do elementów GUI (takich jak z paska górnego)Oznacza to, że pozycja ekranu określona zostanie rozpoczęta w lewym górnym rogu poniżej paska górnego.Dla innej identycznej metody, która nie uwzględnia przesunięcia GUI, użyj ViewportPointToRay().
Ponieważ stworzony jest promień jednostkowy, ma tylko jedną długość szpilki. Aby stworzyć dłuższy promień, możesz wykonać obserwujedziałania:
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal length = 500local unitRay = camera:ScreenPointToRay(100, 100)local extendedRay = Ray.new(unitRay.Origin, unitRay.Direction * length)
Ta metoda działa tylko dla obecnej kamery Workspace.Inne kamery, takie jak te, które tworzysz dla ViewportFrame , mają początkowy rozmiar pola widzenia
Parametry
Pozycja na osi X , w pikselach, punktu ekranu, z którego pochodzi Ray. Ta pozycja stanowi wkład GUI.
Pozycja na osi Y , w pikselach, punktu ekranu, z którego pochodzi Ray. Ta pozycja stanowi wkład GUI.
Zwroty
SetRoll
Ta metoda jest przestarzała i nie jest już uważana za najlepszą praktykę.
Ta metoda ustawia obecny obrót, w radiach, Camera .Ta rolka jest stosowana po CFrame i reprezentuje rotację wokół osi Z kamery.
Na przykład, co następuje, odwróci Camera :
local Workspace = game:GetService("Workspace")Workspace.CurrentCamera:SetRoll(math.pi) -- math.pi radians = 180 degrees
SetRoll nie ma wpływu na jakikolwiek obrót zastosowany za pomocą właściwości CFrame.Przechył zastosowany za pomocą SetRoll nie jest odzwierciedlony w właściwości CFrame ale jest odzwierciedlony w CFrame właściwości zwróconej przez GetRenderCFrame().
Ta metoda może być używana tylko wtedy, gdy CameraType jest ustawiony na Scriptable, niezależnie od tego, czy są używane domyślne skrypty kamery.Jeśli jest używany z jakimkolwiek innym CameraType ostrzeżenie jest podane w wyniku.
Każde obrócenie zastosowane za pomocą tej metody zostanie utracone, gdy CameraType zostanie zmienione z Scriptable.
Aby uzyskać zestaw rolek za pomocą tej metody, użyj GetRoll().
Ponieważ ta metoda jest przestarzała, zaleca się zastosowanie rolek do Camera używając właściwości CFrame. Na przykład:
local Workspace = game:GetService("Workspace")local currentCFrame = Workspace.CurrentCamera.CFramelocal rollCFrame = CFrame.Angles(0, 0, roll)Workspace.CurrentCamera.CFrame = currentCFrame * rollCFrame
Parametry
Zwroty
ViewportPointToRay
Ta metoda tworzy jednostkę Ray z pozycji 2D w bezpiecznej przestrzeni widoku urządzenia, określonej w pikselach.Promień pochodzi z równoważnika 2D pozycji w świecie na danej głębokości (w szpilkach) w odległości Vector3 od Camera.
Jak pokazano poniżej, (0, 0) odpowiada górnemu lewemu punktowi paska górnego Roblox.Oznacza to, że pozycja wejściowa 2D nie nie uwzględnia wkładu CoreUISafeInsets, ale uwzględnia każdy DeviceSafeInsets.

Zauważ, że instancje interfejsu używają innego systemu koordynatów ( używa systemu koordynatów widoku, podczas gdy ta metoda używa systemu koordynatów widoku).Jeśli chcesz określić pozycję w koordynatach UI głównego, użyj ScreenPointToRay().
Zauważ też, że ta metoda działa tylko dla kamery Workspace.CurrentCamera .Inne kamery, takie jak te, które tworzysz dla ViewportFrame, mają początkowy rozmiar pola widzenia (1, 1) i są aktualizowane tylko po ustawieniu ich na CurrentCamera .Niezgodność rozmiaru widoku powoduje, że kamera zwraca promień z błędnym Ray.Direction .
Ta metoda może być używana w połączeniu z właściwością ViewportSize w celu stworzenia promienia z centrum ekranu, na przykład:
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal viewportPoint = camera.ViewportSize / 2local unitRay = camera:ViewportPointToRay(viewportPoint.X, viewportPoint.Y, 0)
Ponieważ stworzony jest promień jednostkowy, ma tylko jedną długość szpilki. Aby stworzyć dłuższy promień, możesz wykonać obserwujedziałania:
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal length = 500local unitRay = camera:ScreenPointToRay(100, 100)local extendedRay = Ray.new(unitRay.Origin, unitRay.Direction * length)
Parametry
Pozycja na osi X w pikselach punktu widoku, z którego pochodzi Ray, w koordynatach bezpiecznej strefy urządzenia.
Pozycja na osi Y w pikselach punktu widoku, z którego pochodzi Ray, w koordynatach bezpiecznej strefy urządzenia.
Zwroty
WorldToScreenPoint
Ta metoda zwraca lokalizację ekranu i głębokość Datatype.Vector3``worldPoint i czy ten punkt znajduje się w granicach ekranu.
Ta metoda bierze pod uwagę obecny wpis GUI, tak jak przestrzeń zajętą przez pasek górny, co oznacza, że pozycja 2D zwrócona jest w tym samym terminie, co pozycje GUI i może być używana do umieszczenia elementów GUI.Dla innej identycznej metody, która ignoruje wstawienie GUI, patrz WorldToViewportPoint().
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal worldPoint = Vector3.new(0, 10, 0)local vector, onScreen = camera:WorldToScreenPoint(worldPoint)local screenPoint = Vector2.new(vector.X, vector.Y)local depth = vector.Z
Zauważ, że ta metoda nie wykonuje żadnego rzucania promieni i prawda lub fałsz wskazująca, czy worldPoint jest w granicach ekranu, będzie true niezależnie od tego, czy punkt jest zasłonięty przez BaseParts lub Terrain .
Parametry
Zwroty
WorldToViewportPoint
Ta metoda zwraca lokalizację ekranu i głębokość Datatype.Vector3``worldPoint i czy ten punkt znajduje się w granicach ekranu.
Ta metoda nie uwzględnia obecnego wstawienia interfejsu graficznego, takiego jak przestrzeń zajęta przez pasek górny, co oznacza, że pozycja 2D zwrócona jest z lewej górnej krawędzi widoku.Chyba że używasz ScreenGui.IgnoreGuiInset, pozycja ta nie jest odpowiednia do umieszczenia elementów interfejsu użytkownika.
Dla innej identycznej metody, która odpowiada za wstawienie interfejsu graficznego, patrz WorldToScreenPoint().
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal worldPoint = Vector3.new(0, 10, 0)local vector, onScreen = camera:WorldToViewportPoint(worldPoint)local viewportPoint = Vector2.new(vector.X, vector.Y)local depth = vector.Z
Zauważ, że ta metoda nie wykonuje żadnego rzucania promieni i prawda lub fałsz wskazująca, czy worldPoint jest w granicach ekranu, będzie true niezależnie od tego, czy punkt jest zasłonięty przez BaseParts lub Terrain .
Parametry
Zwroty
Zdarzenia
InterpolationFinished
To wydarzenie wystrzeliwuje się, gdy Camera skończyło interpolowanie za pomocą metody Camera:Interpolate().Nie strzeli, jeśli nastolatek zostanie przerwany z powodu ponownego wezwania Camera:Interpolate().
Poleca się użycie TweenService do animowania Camera zamiast tego, ponieważ jest to bardziej niezawodne i zapewnia więcej opcji ułatwiających stylizację.