Camera
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Objek Camera mendefinisikan pandangan dunia 3D.Dalam pengalaman yang berjalan, setiap klien memiliki objek sendiri Camera yang berada di lokal klien itu Workspace , dapat diakses melalui properti Workspace.CurrentCamera .
Properti kamera paling penting adalah:
CFrame yang mewakili posisi dan orientasi kamera.
CameraType yang dibaca oleh skrip kamera pengalaman dan menentukan bagaimana kamera harus memperbarui setiap frame.
CameraSubject yang dibaca oleh skrip kamera pengalaman dan menentukan objek mana kamera harus mengikuti.
FieldOfView yang mewakili jangkauan terlihat dari dunia yang dapat diamati.
Focus yang mewakili titik kamera yang dilihat.Penting properti ini atur, karena visual tertentu akan lebih terperinci dan akan diperbarui lebih sering tergantung pada seberapa dekat mereka dengan titik fokus.
Lihat Menyesuaikan Kamera untuk informasi lebih lanjut tentang cara menyesuaikan dan menyesuaikan perilaku kamera.
Menyimpan Beberapa Kamera
Perhatikan bahwa ketika mengubah Workspace.CurrentCamera ke Camera baru, semua yang lain Cameras langsung turun dari Workspace akan hancur.Jika Anda perlu menyimpan banyak kamera dan bertukar di antara mereka sesuai permintaan, disarankan untuk menyimpannya di Folder atau Model di bawah Workspace, di mana mereka akan tetap berada bahkan ketika CurrentCamera diubah.
Rangkuman
Properti
The CFrame dari the Camera , mendefinisikan posisi dan orientasi di dunia 3D.
Menentukan Enum.CameraType untuk dibaca oleh skrip kamera.
Mengatur sudut bidang pandang diagonal kamera.
Mengatur sudut bidang pandang vertikal kamera.
Menentukan nilai FOV dari Camera yang tidak berubah saat mengubah ukuran jendela pandang.
Mengatur area di ruang 3D yang diprioritaskan oleh sistem grafis Roblox.
Mengubah apakah kamera akan secara otomatis melacak gerakan kepala pemain menggunakan perangkat VR.
Mengatur skala perspektif pengguna terhadap dunia saat menggunakan VR.
Mengatur sudut bidang pandang kamera di sepanjang sumbu pandang terpanjang.
Menggambarkan offset negatif Z di stud, dari dekat pesawat pemotong kamera.
Mengubah apakah akan menerapkan kemiringan dan gulir dari properti CFrame saat pemain menggunakan perangkat VR.
Dimensi zona aman perangkat di klien Roblox.
Metode
Kembalikan array dari BaseParts yang menghalangi garis pandang antara titik kamera CFrame dan titik lempar.
Kembalikan yang sebenarnya CFrame di mana Camera diterapkan, memperhitungkan setiap gulungan yang diterapkan dan dampak perangkat VR.
Kembali dalam radian gulungan saat ini, atau rotasi di sekitar sumbu Z kamera, diterapkan ke Camera menggunakan SetRoll() .
Membuat unit Ray dari posisi di layar (dalam piksel), pada kedalaman yang ditentukan dari Camera diarahkan ke kamera.Akun untuk insersi GUI.
Tetapkan rotasi saat ini yang diterapkan di sekitar sumbu Z kamera.
Membuat unit Ray dari posisi di jendela (dalam piksel), pada kedalaman tertentu dari Camera , berorientasi pada arah kamera.Tidak memperhitungkan inset CoreUISafeInsets .
Kembalikan lokasi dan kedalaman layar dari Datatype.Vector3``worldPoint dan apakah titik ini berada dalam batas layar.Akun untuk insersi GUI.
Kembalikan lokasi dan kedalaman layar dari Datatype.Vector3``worldPoint dan apakah titik ini berada dalam batas layar.Tidak mempertimbangkan insersi GUI.
Mendapatkan pivot dari PVInstance .
Mengubah PVInstance bersama dengan semua keturunannya PVInstances sehingga pivot sekarang terletak di lokasi yang ditentukan CFrame .
Acara
Ditembak ketika Camera selesai menginterpolasi menggunakan Interpolate().
Properti
CFrame
Properti ini adalah CFrame dari Camera , yang mendefinisikan posisi dan orientasi di dunia 3D.Perhatikan bahwa beberapa transformasi, seperti rotasi kepala saat menggunakan perangkat VR, tidak tercermin dalam properti ini, jadi Anda harus menggunakan GetRenderCFrame() untuk mendapatkan "nyata" CFrame dari kamera.
Anda dapat memindahkan kamera dengan mengatur properti ini. Namun, skrip kamera default juga mengatur ini, sehingga Anda harus:
Atur kamera CameraType ke Enum.CameraType.Scriptable sehingga skrip kamera default tidak akan memperbarui CFrame kamera.Metode ini paling sederhana dan direkomendasikan dalam kebanyakan kasus.
Sekpenuhnya ganti skrip kamera default dengan alternatif.Pendekatan ini hanya direkomendasikan jika Anda tidak membutuhkan fungsi kamera default.
Cara paling intuitif untuk menempatkan dan memosisikan Camera adalah dengan menggunakan konstruktor CFrame.lookAt().Dalam contoh berikut, Camera di posisikan di Vector3.new(0, 10, 0) dan diposisikan untuk melihat ke arah 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)
Meskipun kamera dapat ditempatkan dengan cara yang ditunjukkan di atas, Anda mungkin ingin menganimasinya untuk bergerak lancar dari satu CFrame ke yang lain.Untuk ini, Anda dapat:
Tetapkan posisi/orientasi kamera setiap frame dengan RunService:BindToRenderStep() dan metode CFrame:Lerp().
Buat dan mainkan Tween yang menganimasikan posisi/orientasi kamera:
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 menerima berbagai Instances . Skrip kamera default menanggapi berbeda dengan pengaturan yang tersedia:
Secara default, skrip kamera mengikuti Humanoid karakter lokal, mempertimbangkan status manusiaoid saat ini dan Humanoid.CameraOffset .
Saat ditetapkan ke BasePart, skrip kamera mengikuti posisinya, dengan offset vertikal dalam kasus VehicleSeats .
CameraSubject tidak dapat ditetapkan ke nil. Mencoba melakukannya akan mengembalikannya ke nilai sebelumnya.
Untuk memulihkan CameraSubject ke nilai defaultnya, atur ke karakter lokal 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
Skrip kamera Roblox default memiliki beberapa perilaku bawaan.Mengatur properti ini beralih di antara berbagai perilaku Enum.CameraType.Perhatikan bahwa beberapa jenis kamera memerlukan CameraSubject yang valid untuk berfungsi dengan benar.
Skrip kamera default tidak akan bergerak atau memperbarui kamera jika CameraType diatur ke Enum.CameraType.Scriptable.Untuk informasi lebih lanjut tentang penempatan dan orientasi kamera secara manual, lihat CFrame .
Untuk semua pengaturan CameraType kecuali Enum.CameraType.Scriptable , properti CameraSubject mewakili objek yang posisinya kamera Focus diatur ke.
DiagonalFieldOfView
Mengatur berapa banyak derajat dalam arah diagonal (dari satu sudut pandang ke sudut berlawanannya) yang dapat dilihat kamera.Lihat FieldOfView untuk penjelasan yang lebih umum tentang bidang pandang.
Perhatikan bahwa DiagonalFieldOfView mewakili bidang pandang yang terlihat oleh rendering Camera ke area layar penuh yang mungkin ditutup oleh notch atau potongan layar di beberapa perangkat.Lihat ViewportSize untuk informasi lebih lanjut.
FieldOfView
Properti FieldOfView (FOV) menetapkan berapa banyak derajat dalam arah vertikal kamera dapat melihat.Properti ini dibatasi antara 1 dan 120 derajat dan default di 70 .Bidang pandang yang sangat rendah atau sangat tinggi tidak direkomendasikan karena dapat membingungkan pemain.
Perhatikan bahwa skala seragam diterapkan, artinya bidang pandang vertikal dan horizontal selalu terkait dengan rasio aspek layar.
Penggunaan yang disarankan untuk FieldOfView termasuk:
- Mengurangi FOV untuk memberikan kesan perbesaran, misalnya saat menggunakan binokel.
- Meningkatkan FOV saat pemain "berlari" untuk memberikan kesan kurangnya kontrol.
Perhatikan bahwa FieldOfView mewakili bidang pandang yang terlihat oleh rendering Camera ke area layar penuh yang mungkin ditutup oleh notch atau potongan layar di beberapa perangkat.Lihat ViewportSize untuk informasi lebih lanjut.
FieldOfViewMode
Kamera FieldOfView (FOV) harus diperbarui untuk mencerminkan perubahan ViewportSize .Nilai dari FieldOfViewMode menentukan nilai FOV mana yang akan tetap konstan.
Sebagai contoh, ketika properti ini diatur ke Enum.FieldOfViewMode.Vertical, FOV horizontal diperbarui saat jendela melihat diubah ukurannya, tetapi FOV vertikal tetap konstan.Jika properti ini diatur ke Enum.FieldOfViewMode.Diagonal , FOV horizontal dan vertikal mungkin diubah untuk menjaga konstan FOV diagonal.
Focus
Beberapa operasi grafis yang dilakukan mesin, seperti memperbarui pencahayaan, dapat memakan waktu atau upaya komputasi untuk diselesaikan.Properti kamera Focus memberi tahu mesin area mana di ruang 3D untuk diprioritaskan saat melakukan operasi seperti itu.Sebagai contoh, pencahayaan dinamis dari objek seperti PointLights mungkin tidak ditampilkan pada jarak jauh dari fokus.
Skrip kamera Roblox default secara otomatis mengatur Focus untuk mengikuti CameraSubject (biasanya Humanoid ).Namun, Focus tidak akan tidak secara otomatis diperbarui saat CameraType diatur ke Enum.CameraType.Scriptable atau saat skrip kamera default tidak digunakan.Dalam kasus ini, Anda harus memperbarui Focus setiap frame, menggunakan metode RunService:BindToRenderStep() pada prioritas Enum.RenderPriority.Camera.
Focus tidak memiliki pengaruh pada posisi atau orientasi kamera; lihat CFrame untuk ini.
HeadLocked
Mengubah apakah kamera akan secara otomatis melacak gerakan kepala pemain menggunakan perangkat VR.Ketika true (默认), mesin menggabungkan CFrame dengan Enum.UserCFrame kepala pengguna untuk menampilkan pandangan pemain dengan faktor pelacakan kepala yang dihitung.Tampilan akan ditampilkan pada berikut 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-- Ini akan setara dengan Camera:GetRenderCFrame()local renderCFrame = camera.CFrame * headCFrame
Disarankan untuk tidak menonaktifkan properti ini karena alasan berikut:
- Pemain dapat mengalami mual jika solusi pelacakan kepala yang setara tidak ditambahkan.
- Mesin Roblox melakukan optimisasi latensi saat HeadLocked benar.
Lihat Juga
- VRService:GetUserCFrame() yang dapat digunakan untuk mendapatkan CFrame kepala.
- VRService:RecenterUserHeadCFrame() yang digunakan untuk memposisikan ulang kepala ke posisi dan orientasi VR saat ini.
HeadScale
HeadScale adalah skala perspektif pengguna terhadap dunia saat menggunakan VR.
Ukuran 1 stud di VR adalah 0.3 meters / HeadScale , artinya nilai yang lebih besar HeadScale sama dengan dunia yang terlihat lebih kecil dari perspektif pengguna saat menggunakan perangkat VR.Sebagai contoh, bagian yang tinggi 1 stud tampaknya tinggi 0,6 meter ke pemain VR dengan .
Properti ini secara otomatis dikontrol oleh VRService.AutomaticScaling untuk menyesuaikan perspektif pemain dengan ukuran avatar mereka.Jika Anda berniat untuk mengontrol HeadScale diri sendiri atau menggunakan karakter khusus, beralih VRService.AutomaticScaling ke Enum.VRScaling.Off .
Properti ini tidak boleh dikacaukan dengan Humanoid.HeadScale yang merupakan NumberValue orangtua ke Humanoid untuk mengontrol skalanya.
MaxAxisFieldOfView
Properti MaxAxisFieldOfView mengatur berapa banyak derajat di sepanjang sumbu pandang terpanjang yang dapat dilihat kamera.
Ketika sumbu terpanjang adalah sumbu vertikal, properti ini akan berperilaku mirip dengan properti FieldOfView.Ini umumnya terjadi ketika perangkat berada dalam orientasi potret.Dalam orientasi pemandangan, sumbu terpanjang akan menjadi sumbu horizontal; dalam kasus ini, properti menggambarkan bidang pandang horizontal dari Camera .
NearPlaneZ
Properti NearPlaneZ menggambarkan seberapa jauh pesawat pemotong dekat kamera, dalam stud.Pesawat pemotong dekat adalah pesawat geometris yang berada di depan kamera CFrame .Apa pun antara pesawat ini dan kamera tidak akan ditampilkan, membuat tampilan potong saat melihat objek pada jarak sangat pendek.Nilai dari NearPlaneZ bervariasi di antara berbagai platform dan saat ini selalu antara -0.1 dan -0.5 .

VRTiltAndRollEnabled
Properti ini beralih apakah akan menerapkan kemiringan dan gulir dari properti CFrame saat pemain menggunakan perangkat VR.
Untuk mencegah penyakit gerakan, cakrawala harus tetap level.Miring dan menggulir pandangan pemain saat menggunakan perangkat VR dapat menyebabkan terputusnya antara ruang fisik pemain dan ruang virtual yang mereka lihat.Mengubah arah ke bawah yang tampak bisa menyebabkan pemain kehilangan keseimbangan atau mengalami pusing.
Untuk alasan ini, umumnya disarankan untuk meninggalkan properti ini dinonaktifkan, kecuali Anda telah secara ekstensif menguji pengalaman Anda untuk efek ini.Bahkan dengan kemiringan dan gulungan diaktifkan, Anda mungkin ingin memastikan pemain selalu memiliki frame referensi yang stabil, seperti interior kendaraan atau lantai yang dapat membantu pemain mendaratkan diri di ruang fisik mereka.
ViewportSize
ViewportSize kembali dimensi area aman perangkat di layar saat ini.Area ini adalah segi empat yang mencakup area bilah atas Roblox tetapi tidak termasuk notifikasi perangkat atau pemotongan layar.Unit dari ViewportSize adalah unit offset UI Roblox yang mungkin berbeda dari piksel tampilan asli.

Seperti disebutkan di atas, ViewportSize tidak sama dengan ukuran area layar penuh pada tampilan dengan cutout atau notch.Untuk mendapatkan ukuran area layar penuh di semua tampilan, Anda dapat menanyakan properti AbsoluteSize dari sebuah ScreenGui dengan ScreenInsets diatur ke None .Lihat Enum.ScreenInsets untuk informasi lebih lanjut tentang cara mendefinisikan area layar.
Akhirnya, perhatikan bahwa ViewportSize bukan ukuran jendela yang sebenarnya yang digunakan kamera untuk rendering (kamera rendah di area layar penuh).Juga, properti FieldOfView dan DiagonalFieldOfView berdasarkan pada area layar penuh, bukan ViewportSize.
Pembaruan Kamera
Hanya Camera saat ini yang disebutkan oleh Workspace.CurrentCamera memiliki ViewportSize diperbarui setiap frame selama langkah PreRender .The ViewportSize dari semua kamera lain dalam pengalaman Anda tidak akan diperbarui, termasuk yang digunakan untuk ViewportFrames .
Metode
GetPartsObscuringTarget
Metode ini mengembalikan array dari BaseParts yang menghalangi garis pandang antara posisi kamera CFrame dan Vector3 di array castPoints.Setiap Instances termasuk dalam array ignoreList akan diabaikan, bersama dengan keturunann mereka.
Parameter castPoints diberikan sebagai array dari Vector3 posisi.Perhatikan bahwa array dari BaseParts dikembalikan dalam urutan acak, dan tidak ada data raycast tambahan yang disediakan.Jika Anda membutuhkan data seperti posisi pukul, bahan pukul, atau permukaan normal, Anda harus memilih metode 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)
Jika Terrain menghalangi titik lempar, BaseParts menghalangi titik lempar di antara penghalang Terrain dan titik lempar tidak akan dikembalikan.
Parameter
Sebuah array dari Instances yang harus diabaikan, bersama dengan keturunann mereka.
Memberikan nilai
GetRenderCFrame
Metode ini mengembalikan aktual CFrame dari Camera sebagai itu ditampilkan, termasuk dampak VR (transformasi kepala VR tidak diterapkan pada properti CFrame , jadi praktik terbaik adalah menggunakan GetRenderCFrame() untuk mendapatkan "nyata" CFrame pandangan pemain).
Sebagai contoh, saat menggunakan VR, Camera sebenarnya drender di berikut 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 kamera CFrame hanya akan diubah untuk menghitung kepala saat properti HeadLocked benar.
Memberikan nilai
GetRoll
Metode ini kembali, dalam radian, gulungan saat ini yang diterapkan ke Camera menggunakan SetRoll() .Roll didefinisikan sebagai rotasi di sekitar sumbu Z kamera.
Metode ini hanya mengembalikan gulungan yang diterapkan menggunakan metode SetRoll().Roll secara manual diterapkan ke kamera CFrame tidak dihitung.Untuk mendapatkan gulungan aktual dari Camera , termasuk gulungan yang diterapkan secara manual, Anda dapat menggunakan potongan berikut:
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
Memberikan nilai
Contoh Kode
Contoh ini, saat digunakan dalam LocalScript, akan mengambil gulungan kamera saat ini dalam derajat.Kemudian, jika sudut putaran kamera tidak 20 derajat, sudut putaran kamera diatur ke 20 derajat.
local currentRoll = math.deg(workspace.CurrentCamera:GetRoll()) -- Mendapatkan gulungan kamera saat ini dalam derajat.
if currentRoll ~= 20 then
workspace.CurrentCamera:SetRoll(math.rad(20)) -- Jika kamera tidak berada pada sudut 20 derajat, gulir diatur ke 20 derajat.
end
ScreenPointToRay
Metode ini membuat unit Ray dari posisi 2D di layar (didefinisikan dalam piksel), yang menyumbangkan GUI yang dimasukkan.Asal Ray berasal dari Vector3 setara dengan posisi 2D di dunia pada kedalaman yang diberikan (dalam stud) jauh dari Camera .
Karena metode ini mengakui insersi GUI, offset yang diterapkan ke elemen GUI (seperti dari bilah atas) dihitung.Ini berarti posisi layar yang ditentukan akan dimulai di sudut kiri atas bawah bilah atas.Untuk metode identik lainnya yang tidak mempertimbangkan offset GUI, gunakan ViewportPointToRay() .
Karena Ray yang dibuat adalah sinar unit, hanya panjang satu stud. Untuk membuat sinar yang lebih panjang, Anda dapat melakukan hal mengikuti:
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)
Metode ini hanya berfungsi untuk kamera Workspace saat ini.Kamera lain, seperti kamera yang Anda buat untuk ViewportFrame , memiliki ukuran jendela pandang awal
Parameter
Posisi di sumbu X , dalam piksel, pada titik layar di mana berasal Ray . Posisi ini menyumbangkan inseran GUI.
Posisi di sumbu Y pada sumbu, dalam piksel, dari titik layar di mana asal Ray . Posisi ini menyumbangkan inseran GUI.
Memberikan nilai
SetRoll
Metode ini sudah usang dan tidak lagi dianggap sebagai praktik terbaik.
Metode ini menetapkan gulungan saat ini, dalam radian, dari Camera .Gulungan diterapkan setelah CFrame dan mewakili rotasi di sekitar sumbu Z kamera.
Sebagai contoh, berikut akan mengbalikkan Camera :
local Workspace = game:GetService("Workspace")Workspace.CurrentCamera:SetRoll(math.pi) -- math.pi radians = 180 degrees
SetRoll tidak memiliki efek pada gulungan apa pun yang diterapkan menggunakan properti CFrame.Roll diterapkan menggunakan SetRoll tidak dicerminkan dalam properti CFrame tetapi dicerminkan dalam CFrame yang dikembalikan oleh GetRenderCFrame() .
Metode ini hanya dapat digunakan ketika CameraType diatur ke Scriptable, terlepas dari apakah skrip kamera default digunakan atau tidak.Jika digunakan dengan yang lain CameraType peringatan diberikan dalam output.
Setiap gulungan yang diterapkan menggunakan metode ini akan hilang saat CameraType diubah dari Scriptable .
Untuk mendapatkan roll set menggunakan metode ini gunakan GetRoll() .
Karena metode ini sudah ketinggalan zaman, Anda disarankan untuk menerapkan roll ke Camera menggunakan properti CFrame. Misalnya:
local Workspace = game:GetService("Workspace")local currentCFrame = Workspace.CurrentCamera.CFramelocal rollCFrame = CFrame.Angles(0, 0, roll)Workspace.CurrentCamera.CFrame = currentCFrame * rollCFrame
Parameter
Memberikan nilai
ViewportPointToRay
Metode ini membuat unit Ray dari posisi 2D di port pandang aman perangkat, didefinisikan dalam piksel.Sinar berasal dari Vector3 setara dengan posisi 2D di dunia pada kedalaman yang diberikan (dalam stud) jauh dari Camera .
Seperti yang ditunjukkan di bawah, (0, 0) sesuai dengan titik bagian atas kiri dari bilah atas Roblox.Ini berarti bahwa posisi input 2D tidak tidak memperhitungkan inserat CoreUISafeInsets , tetapi memperhitungkan apa pun DeviceSafeInsets .

Perhatikan bahwa instansi UI menggunakan sistem koordinat yang berbeda ( menggunakan sistem koordinat viewport sementara metode ini menggunakan sistem koordinat viewport).Jika Anda ingin menentukan posisi dalam koordinat UI utama, silakan gunakan ScreenPointToRay() .
Perhatikan juga bahwa metode ini hanya berfungsi untuk kamera Workspace.CurrentCamera .Kamera lain, seperti kamera yang Anda buat untuk ViewportFrame , memiliki ukuran jendela pandang awal (1, 1) dan hanya diperbarui setelah Anda mengatur mereka ke CurrentCamera .Ketidakcocokan dalam ukuran viewport menyebabkan kamera untuk mengembalikan sebuah sinar dengan salah Ray.Direction .
Metode ini dapat digunakan bersama dengan properti ViewportSize untuk membuat sebuah sinar dari pusat layar, misalnya:
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal viewportPoint = camera.ViewportSize / 2local unitRay = camera:ViewportPointToRay(viewportPoint.X, viewportPoint.Y, 0)
Karena Ray yang dibuat adalah sinar unit, hanya panjang satu stud. Untuk membuat sinar yang lebih panjang, Anda dapat melakukan hal mengikuti:
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)
Parameter
Posisi di sumbu X , dalam piksel, pada titik pandang di mana asal Ray , dalam koordinat zona aman perangkat.
Posisi di sumbu Y pada sumbu, dalam piksel, dari titik pandang di mana asal Ray , dalam koordinat zona aman perangkat.
Memberikan nilai
WorldToScreenPoint
Metode ini mengembalikan lokasi layar dan kedalaman dari Datatype.Vector3``worldPoint dan apakah titik ini berada dalam batas layar.
Metode ini mempertimbangkan insert GUI saat ini, seperti ruang yang ditempati oleh bilah atas, sehingga posisi 2D yang dikembalikan berada di dalam istilah yang sama dengan posisi GUI dan dapat digunakan untuk menempatkan elemen GUI.Untuk metode identik lainnya yang mengabaikan insersi GUI, lihat 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
Perhatikan metode ini tidak melakukan raycasting apa pun dan boolean yang menunjukkan apakah worldPoint berada dalam batas layar akan menjadi true terlepas dari apakah titik terhalang oleh BaseParts atau Terrain .
Parameter
Memberikan nilai
Sebuah tuple yang berisi, dalam urutan:
Sebuah yang whose X dan Y komponen mewakili offset dari sudut kiri atas layar, dalam piksel.Komponen Z mewakili kedalaman dari layar (dalam stud)
Sebuah boolean yang menunjukkan apakah worldPoint berada dalam batas layar.
WorldToViewportPoint
Metode ini mengembalikan lokasi layar dan kedalaman dari Datatype.Vector3``worldPoint dan apakah titik ini berada dalam batas layar.
Metode ini tidak mempertimbangkan insert GUI saat ini, seperti ruang yang ditempati oleh bilah atas, sehingga posisi 2D yang dikembalikan diambil dari sudut kiri atas tampilan.Kecuali Anda menggunakan ScreenGui.IgnoreGuiInset, posisi ini tidak cocok untuk menempatkan elemen GUI.
Untuk metode identik lainnya yang menyumbangkan insersi GUI, lihat 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
Perhatikan metode ini tidak melakukan raycasting apa pun dan boolean yang menunjukkan apakah worldPoint berada dalam batas layar akan menjadi true terlepas dari apakah titik terhalang oleh BaseParts atau Terrain .
Parameter
Memberikan nilai
Sebuah tuple yang berisi, dalam urutan:
Sebuah yang whose X dan Y komponen mewakili offset dari sudut kiri atas tampilan, dalam piksel.Komponen Z mewakili kedalaman dari layar (dalam stud)
Sebuah boolean yang menunjukkan apakah worldPoint berada dalam batas layar.
Acara
InterpolationFinished
Peristiwa ini terjadi ketika Camera telah selesai menginterpolasi menggunakan metode Camera:Interpolate().Ini tidak akan menembak jika seorang remaja terputus karena Camera:Interpolate() dipanggil lagi.
Anda disarankan untuk menggunakan TweenService untuk menganimasikan Camera sebagai gantinya, karena lebih dapat diandalkan dan memberikan lebih banyak pilihan untuk meringankan gaya.