Camera

Pokaż przestarzałe

*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.

Bez replikacji

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

Właściwości odziedziczeni z: PVInstance
  • Bez replikacji
    Brak możliwości dodawania do skryptu
    Odczyt równoległy
  • Bez replikacji
    Brak możliwości dodawania do skryptu
    Odczyt równoległy

Metody

Metody odziedziczeni z: PVInstance

Właściwości

CFrame

Odczyt równoległy

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.CurrentCamera
camera.CameraType = Enum.CameraType.Scriptable
local 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.CurrentCamera
    camera.CameraType = Enum.CameraType.Scriptable
    local player = Players.LocalPlayer
    local character = player.Character
    if not character or character.Parent == nil then
    character = player.CharacterAdded:Wait()
    end
    local pos = camera.CFrame * Vector3.new(0, 20, 0)
    local lookAtPos = character.PrimaryPart.Position
    local targetCFrame = CFrame.lookAt(pos, lookAtPos)
    local tween = TweenService:Create(camera, TweenInfo.new(2), {CFrame = targetCFrame})
    tween:Play()

CameraSubject

Odczyt równoległy

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

Odczyt równoległy

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

Bez replikacji
Odczyt równoległy

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

Odczyt równoległy

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

Odczyt równoległy

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

Odczyt równoległy

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

Odczyt równoległy

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.CurrentCamera
local 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

HeadScale

Odczyt równoległy

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

Bez replikacji
Odczyt równoległy

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

Tylko do odczytu
Bez replikacji
Odczyt równoległy

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.

Diagram showing how the NearPlaneZ clips (does not render) 3D content between the plane and the camera.

VRTiltAndRollEnabled

Odczyt równoległy

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

Tylko do odczytu
Bez replikacji
Odczyt równoległy

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.

Mobile device screen with cutout showing device safe area.

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

Instances

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.CurrentCamera
local 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

castPoints: Array

Mała liczba Vector3 pozycji punktów rzucania.

Wartość domyślna: ""
ignoreList: Instances

Matryca Instances, którą należy ignorować wraz z jej potomkami.

Wartość domyślna: ""

Zwroty

Instances

Matryca BaseParts, która zasłania linię widzenia między kamerą CFrame a castPoints.

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.CurrentCamera
local headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)
headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScale
renderCFrame = camera.CFrame * headCFrame

Render kamery CFrame zostanie zmieniony tylko w celu uwzględnienia głowy, gdy właściwość HeadLocked jest prawdą.


Zwroty

The CFrame the Camera jest renderowany na.

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

Obecny obrót zastosowany przez SetRoll() , w radiach.

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.

Camera:GetRoll

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

Zapis równoległy

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.CurrentCamera
local length = 500
local 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 (1, 1) i są aktualizowane tylko po ustawieniu ich na Workspace.CurrentCamera .Niezgodność rozmiaru widoku powoduje, że kamera zwraca promień z błędnym Ray.Direction .

Parametry

Pozycja na osi X , w pikselach, punktu ekranu, z którego pochodzi Ray. Ta pozycja stanowi wkład GUI.

Wartość domyślna: ""

Pozycja na osi Y , w pikselach, punktu ekranu, z którego pochodzi Ray. Ta pozycja stanowi wkład GUI.

Wartość domyślna: ""
depth: number

Głębokość z Camera, w szpilkach, z której można odejmować pochodzenie Ray .

Wartość domyślna: 0

Zwroty

Jednostka , pochodząca z równoważnej pozycji świata w odległości od pozycji ekranu danego głębokości w odległości od .Ten promień jest skierowany w kierunku Camera .

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.CFrame
local rollCFrame = CFrame.Angles(0, 0, roll)
Workspace.CurrentCamera.CFrame = currentCFrame * rollCFrame

Parametry

rollAngle: number

Kąt obrotu, w radiach, który ma być zastosowany do Camera.

Wartość domyślna: ""

Zwroty

()

ViewportPointToRay

Zapis równoległy

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.

Diagram showing the origin of the device safe area viewport coordinate system.

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.CurrentCamera
local viewportPoint = camera.ViewportSize / 2
local 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.CurrentCamera
local length = 500
local 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.

Wartość domyślna: ""

Pozycja na osi Y w pikselach punktu widoku, z którego pochodzi Ray, w koordynatach bezpiecznej strefy urządzenia.

Wartość domyślna: ""
depth: number

Głębokość z Camera, w szpilkach, z której można odejmować pochodzenie Ray .

Wartość domyślna: 0

Zwroty

Jednostka Ray, pochodząca z równoważnej pozycji świata Vector3 w danym oddaleniu od pozycji widoku Camera .Ten promień jest skierowany w kierunku Camera .

WorldToScreenPoint

Zapis równoległy

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.CurrentCamera
local 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

worldPoint: Vector3

Pozycja świata Vector3.

Wartość domyślna: ""

Zwroty

Tuple zawierający, w kolejności:

  • A którego składniki X i Y reprezentują odległość od górnego lewego rogu ekranu, w pikselach.Komponent Vector3 Z reprezentuje głębokość worldPoint z ekranu (w szpilkach).

  • Boolean wskazujący, czy worldPoint znajduje się w granicach ekranu.

WorldToViewportPoint

Zapis równoległy

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.CurrentCamera
local 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

worldPoint: Vector3

Pozycja świata Vector3.

Wartość domyślna: ""

Zwroty

Tuple zawierający, w kolejności:

  • A >, którego składniki X i Y reprezentują odległość od górnego lewego krawędzi pola widzenia, w pikselach.Komponent Vector3 Z reprezentuje głębokość worldPoint z ekranu (w szpilkach).

  • Boolean wskazujący, czy worldPoint znajduje się w granicach ekranu.

ZoomToExtents

()

Parametry

boundingBoxCFrame: CFrame
Wartość domyślna: ""
boundingBoxSize: Vector3
Wartość domyślna: ""

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ę.