ฉันจะทำให้อนุภาคเรืองแสงและส่องสว่างบริเวณรอบ ๆ ได้อย่างไร


22

ฉันกำลังพยายามทำให้หิ่งห้อยมีผลต่อป่ามืด ระดับมีแสงน้อยมากและผู้เล่นเป็นหนึ่งในแหล่งกำเนิดแสงไม่กี่แห่ง เพื่อให้ผู้เล่นเห็นระดับที่ดีขึ้นฉันพยายามทำให้หิ่งห้อยเรืองแสงปรากฏขึ้นแบบสุ่มบนแผนที่ วิธีหนึ่งคือการใช้ระบบอนุภาค แต่ฉันไม่สามารถทำให้อนุภาคของแสงส่องไปรอบ ๆ มีวิธีทำเช่นนี้หรือไม่?


3
ปัญหาจริงที่นี่คือ "แสงมีราคาแพง" คุณอาจจะดีกว่าการวางไฟจุดคงที่ที่ทำให้บริเวณนั้นสว่างพอเพียงแล้วนำแสงเข้ามาในรูปแบบของแสงจากนั้นใช้อนุภาคเพื่ออธิบายว่าแหล่งกำเนิดแสงมาจากที่ใด
Draco18s

@ Draco18s ไม่มีหิ่งห้อยมากมาย พวกเขาจะปรากฏในมุมมองของผู้เล่นเท่านั้น มันอยู่ด้านบนและควบคุมได้ง่าย และในเวลาใดก็ตามควรมีหิ่งห้อยน้อยกว่า 10 ตัวเท่านั้น ฉันไม่คิดว่า 10 จุดแสงแบบไดนามิกมีราคาแพง?
DarkDestry

ตามค่าเริ่มต้น Unity จะอนุญาตให้ไฟแบบไดนามิกที่ใช้งานอยู่สองส่องสว่างในแต่ละครั้ง (แม้ว่าอาจแตกต่างกันสำหรับการตั้งค่า 2D) คุณสามารถเพิ่มสิ่งนี้ได้ แต่จำไว้ว่า +1 แสงคือ x2 ที่ส่งผลกระทบต่อการเรียกสาย
Draco18s

2
@ Draco18s นี่อาจเป็นความจริงของเส้นทางการแสดงผลไปข้างหน้า แต่ตามที่ระบุไว้ในเอกสาร "เมื่อใช้การแรเงาแบบ Deferred ไม่มีข้อ จำกัด เกี่ยวกับจำนวนของแสงที่สามารถส่งผลกระทบต่อวัตถุ" - ไฟขนาดเล็กจำนวนมากที่มีผลเพียงเล็กน้อย หน้าจอเป็นรูปแบบการใช้งานที่ถูกต้องกรณีพา ธ การเรนเดอร์ที่ทำได้ดีกว่าที่การจัดการอย่างมีประสิทธิภาพ (ด้วยค่าใช้จ่ายโดยทั่วไปของการโทรหนึ่งครั้งต่อแสงที่ไม่ซ้ำกันแทนที่จะเป็นตัวคูณเช่นเดียวกับการเรนเดอร์ไปข้างหน้า)
DMGregory

นั่นเป็นจุดที่ดี ฉันลืมเกี่ยวกับเส้นทางการแสดงผลที่แตกต่างกันเกือบตลอดเวลา
Draco18s

คำตอบ:


7

อนุภาคเปล่งแสงขณะนี้สร้างขึ้นในฟีเจอร์ Unity ใน 5.5

เพียงเปิดใช้งานแสงไฟในเครื่องตรวจจับอนุภาคโยนการอ้างอิงไปยังแสงรูปแบบสำเร็จรูป (ทำงานทั้งจุดและจุดไฟ) และเปลี่ยนอัตราส่วนเป็น 1

ป้อนคำอธิบายรูปภาพที่นี่

และvoilàอนุภาคที่เปล่งแสง: ! [ใส่คำอธิบายภาพที่นี่

กลับกลายเป็นว่านี่เป็นการตั้งค่าที่เหมาะสมที่สุดซึ่งทำงานที่ 1500 + fps บนแท่นขุดน้ำมันของฉันแม้จะมีไฟสูงสุดเป็นร้อย ๆ

แก้ไข: หลังจากการสังเกตุบางอย่างฉันคิดว่าแสงของอนุภาคสลับไปมาระหว่างแสงส่วนต่าง ๆ และแสงจุดยอด (น่าจะเหมาะสำหรับการเพิ่มประสิทธิภาพ?) สิ่งนี้อาจสร้างสิ่งประดิษฐ์ที่มองเห็นได้เล็กน้อยหากตั้งค่าแสงสูงสุดไว้สูงเกินไป

แก้ไข 2: ตามที่ DMGregory ระบุไว้สิ่งประดิษฐ์เป็นผลพลอยได้จากการปรับการเรนเดอร์ไปข้างหน้า แสงที่เลื่อนออกไปจะช่วยแก้ปัญหานี้ได้ เพิ่ม nicer gif


1
นั่นเป็นข่าวดี! :) คำตอบนี้จะดียิ่งขึ้นถ้ามีคำแนะนำทีละขั้นตอนสำหรับวิธีการตั้งค่านี้ด้วยคุณสมบัติระบบอนุภาคใหม่
DMGregory

1
พฤติกรรมแสงของจุดสุดยอดที่คุณเห็นจะฟังดูคล้ายกับการเพิ่มประสิทธิภาพบางอย่างที่ Unity นำไปใช้ในการเรนเดอร์เรนจ์ คุณเห็นลักษณะการทำงานเดียวกันเมื่อคุณใช้เส้นทางที่เลื่อนออกไปหรือไม่
DMGregory

คุณถูก! สิ่งประดิษฐ์จะไม่ปรากฏอีกต่อไปเมื่อใช้เส้นทางการแสดงผลที่เลื่อนออกไป
eclmist

31

Heads-Up:

คำตอบนี้ล้าสมัยแล้ว ตอนนี้ความสามัคคีรองรับอนุภาคแสงจุดกำเนิด โปรดดูคำตอบนี้สำหรับรายละเอียดทั้งหมด

ฉันจะปล่อยให้โพสต์ที่นี่สำหรับผู้ที่อยากรู้อยากเห็นหรือใช้ Unity รุ่นเก่าหรือต้องการการควบคุมด้วยตนเองมากกว่าวิธีที่เสนอให้ - โปรดทราบว่าการสนับสนุนดั้งเดิมน่าจะมีประสิทธิภาพและปรับขนาดได้มากกว่าวิธีที่เสนอด้านล่าง


ฉันไม่แน่ใจว่าทำไมคำตอบมากมายอ้างว่าเป็นเรื่องยากหรือเป็นไปไม่ได้ การจัดการไฟจุดแบบไดนามิกไม่กี่โหลนั้นถือเป็นเรื่องปกติสำหรับไปป์ไลน์เรนเดอร์สมัยใหม่ที่ทำงานบนพีซี

นี่เป็นตัวอย่างสั้น ๆ ที่ฉันทำขึ้น: ตัวอย่างของหิ่งห้อยที่มีแสงไฟ

ฉันใช้สคริปต์นี้เพื่อวางไข่แสงมากพอสำหรับอนุภาคสูงสุดของฉัน (ตรวจสอบให้แน่ใจว่าคุณปรับการตั้งค่าระบบอนุภาคของคุณเพื่อให้ค่าสูงสุดเหมาะสม - ค่าเริ่มต้น 1,000 จะไม่ทำให้การ์ดกราฟิกของคุณมีความสุขมาก) จากนั้นอัปเดต อนุภาค:

[RequireComponent(typeof(ParticleSystem))]
public class ParticleLights : MonoBehaviour {

    public Light lightPrefab;

    ParticleSystem _system;
    ParticleSystem.Particle[] _particles;
    Light[] _lights;


    void Start () {
        _system = GetComponent<ParticleSystem>();
        _particles = new ParticleSystem.Particle[_system.maxParticles];

        _lights = new Light[_system.maxParticles];
        for(int i = 0; i < _lights.Length; i++)
        {
            _lights[i] = (Light)Instantiate(lightPrefab);
            _lights[i].transform.parent = transform;
        }
    }

    void Update () {

        int count = _system.GetParticles(_particles);
        for(int i = 0; i < count; i++)
        {
            _lights[i].gameObject.SetActive(true);
            _lights[i].transform.localPosition = _particles[i].position;

            // Looks like the GetCurrentColor function was added in 5.3.
            // You can use other methods in earlier Unity versions.
            _lights[i].color = _particles[i].GetCurrentColor(_system);
        }

        for (int i = count; i < _particles.Length; i++)
        {
            _lights[i].gameObject.SetActive(false);
        }
    }
}

แก้ไข:คุณสามารถสร้างรูปแบบสำเร็จรูปได้โดยสร้างวัตถุเกมเป็นอันดับแรก (ในกรณีนี้สร้าง -> แสง -> จุดไฟ) ตั้งค่าด้วยชื่อ / พารามิเตอร์ / สคริปต์ / ลูก ๆ ที่คุณต้องการจากนั้นลากจากลำดับชั้นของคุณมา Project explorer ของคุณ สิ่งนี้จะบันทึกวัตถุเป็นสินทรัพย์ที่คุณสามารถนำมาใช้ซ้ำในหลาย ๆ ฉาก & สคริปต์พร้อมระดับการสืบทอด คุณสามารถลบสำเนาในฉากของคุณและเนื้อหาจะยังคงอยู่ในโฟลเดอร์สินทรัพย์ของคุณเพื่ออ้างอิงเมื่อจำเป็น

ตรวจสอบให้แน่ใจว่า lightPrefab นั้นมีขนาดค่อนข้างเล็กและไม่ได้เป็นเงาเพื่อให้คุณมีประสิทธิภาพสูงสุดสำหรับทุกสิ่งที่เกิดขึ้นในฉากของคุณ คุณไม่จำเป็นต้องทำให้แสงแท็บเบา ๆ เป็นสีเขียว (หรือสีของหิ่งห้อยของคุณ) - มันจะมาจากสีของอนุภาค

คุณอาจพบว่าคุณสามารถควบคุมหิ่งห้อยได้ดีกว่าหากคุณสร้าง GameObject ของตัวเองแต่ละตัวด้วยรูปสี่เหลี่ยมที่มีป้ายโฆษณาและแสงที่แนบมากับการเคลื่อนไหว / สคริปต์ blinkig แบบกำหนดเองเนื่องจากการใช้ความเชื่อที่น่าเชื่อถือ ฉันรู้ว่า. ;)


จริงๆแล้ว ... ถึงแม้ว่าฉันจะบอกว่าไม่ใช้การแชทแบบหิ่งห้อยสำหรับหิ่งห้อย แต่ฉันก็ลองเปิดมันในฉากตัวอย่างของฉันและมันก็ไม่ได้ทำให้เกิดปัญหาใด ๆ วิธีที่เงาจะแกว่งไปมาขณะที่หิ่งห้อยเคลื่อนผ่านวัตถุนั้นเย็นมากและสามารถเพิ่มบรรยากาศที่น่ากลัวได้ ระยะทางของคุณอาจแตกต่างกันไปตามความซับซ้อนของฉากและฮาร์ดแวร์เป้าหมายของคุณดังนั้นโปรไฟล์ต้องแน่ใจ แต่นี่อาจเป็นกรณีของการปรับให้เหมาะสมก่อนกำหนดในส่วนของฉัน :)
DMGregory

คุณจะสร้าง prefab เบา ๆ ได้อย่างไร
DarkDestry

นอกจากนี้ด้วยเหตุผลบางอย่าง ParticleSystem.Particle หมายถึงอนุภาคแบบดั้งเดิม ไม่มีวิธี GetCurrentColor หรือ GetCurrentSize
DarkDestry

@DarkDestry ฉันได้เพิ่มบันทึกไปยังคำตอบเกี่ยวกับการสร้าง prefab สำหรับฟังก์ชั่นที่ขาดหายไปนี่อาจเป็นปัญหาของรุ่น - ฉันทำงานใน 5.3 ใน Unity รุ่นก่อนหน้านี้คุณอาจใช้วิธีอื่น มาพูดคุยรายละเอียดการใช้งานในการแชทโดยใช้ห้อง Hamza Hasan ได้โปรดสร้าง
DMGregory

ดังนั้นแสงรูปแบบสำเร็จรูปจึงเหมือนกับรูปแบบปกติทั่วไป สับสนเมื่อถูกกล่าวถึงในรูปแบบแสงสำเร็จรูป
DarkDestry

3

หลายปีที่ผ่านมาก่อนที่แสงแบบไดนามิกจะมีราคาไม่แพงเราก็จะใช้เอฟเฟกต์ของอนุภาคแบบสองมิติกับการผสมแบบเติมแต่ง มันจะเพิ่มความสว่างให้ฉากสีขาว ด้วยการวาดภาพด้วยหิ่งห้อยที่มีความลึกที่ถูกต้อง อัลฟาเติมแต่งไม่จำเป็นต้องจัดเรียงเมื่อทำการถอนตัวเองมากกว่าการผสมอัลฟา มันจะไม่สว่างขึ้นทุกฉาก แต่มันจะส่องสว่างพื้นที่โดยรอบหิ่งห้อย จากนั้นคุณสามารถใช้แสงแบบไดนามิกและเลือกหิ่งห้อยอันใดอันหนึ่งทุกสองสามวินาทีเพื่อให้แสงฉากนั้น ๆ ถ้าคุณต้องการ

มีคำถามและคำตอบเกี่ยวกับเอฟเฟกต์แสงวิธีการให้แสงแบบนี้ใน Unity สำหรับเกม 2D?


0

น่าเสียดายที่ฉันไม่ได้มีประสบการณ์กับ Unity มากนักในรูปแบบปัจจุบัน (ฉันเล่นกับมันเมื่อหลายปีก่อน) ดังนั้นฉันจึงไม่รู้ว่าคุณลักษณะใดที่ทำให้คุณต้องทำงานกับเครื่องยนต์

ไม่ว่าคุณจะทำงานกับเครื่องยนต์แบบใดไฟแบบไดนามิกเป็นสิ่งที่คุณควรหลีกเลี่ยงเมื่อใดก็ตามที่คุณทำได้ พวกเขามีราคาแพงมากและมีแนวโน้มที่จะเพิ่มความซับซ้อนของฉากในลักษณะที่อธิบายมาก อย่างไรก็ตามตามคำสั่งของวันสำหรับการเรนเดอร์ 3D ส่วนใหญ่มีหลายวิธีที่คุณสามารถใช้เอฟเฟ็กต์ที่คล้ายกันโดยการโกง

วิธีที่เป็นไปได้เพื่อให้ได้เอฟเฟกต์ที่คล้ายกันคือการทำแผนที่พื้นผิวเรืองแสงที่ทำไว้ล่วงหน้าไปยังภูมิประเทศด้านล่างหิ่งห้อยของคุณ (สมมติว่าระบบ Y = ขึ้น / ลง coord) ด้วยตำแหน่ง X และ Z ที่ควบคุมตำแหน่งของแสงบนภูมิประเทศ จากภูมิประเทศที่ควบคุมอัลฟาของพื้นผิว (สว่าง = ใกล้เคียงกับภูมิประเทศ)

มีข้อเสียหลายอย่างสำหรับวิธีนี้ คุณจะไม่ทิ้งเงาเนื่องจากไม่ใช้แสงและคุณจะไม่ส่งผลกระทบต่อรูปทรงเรขาคณิตอื่น ๆ ในโลก (อุปกรณ์ประกอบฉากใบไม้ ฯลฯ )


-2

ใช้Lightที่จุดเริ่มต้นของไฟและเล่นกับขนาดในสคริปต์ดังนั้นมันจะให้ผลของการเผาไหม้ และใช้ระบบอนุภาคของคุณ :)


ไม่มีไฟในที่เกิดเหตุ ฉันมีอนุภาคที่หายากปรากฏในและนอก ไม่มีตำแหน่งคงที่สำหรับอนุภาคเลย โปรดอ่านคำถาม
DarkDestry

ดังนั้นการจัดการคืออะไร? คุณสามารถติดแสงเข้ากับชิ้นส่วนสำเร็จรูปของอนุภาคแทนได้ที่ตำแหน่งที่กำหนดไว้ล่วงหน้า
Hamza Hasan

คำถามคือทำอย่างไร ฉันกำลังใช้ระบบอนุภาคของความเป็นเอกภาพ และฉันไม่เห็นรูปแบบสำเร็จรูปที่นั่น หากคุณไม่ขอให้ฉันสร้าง prefab ที่มีแสงสว่างและสร้างฐานในสคริปต์
DarkDestry

ดังนั้นคุณมีเกมอนุภาคออกมาในฉาก แนบไฟไปยังวัตถุเกมเดียวกันและสร้างรูปแบบสำเร็จรูปโดยการลากเกมดังกล่าวไปยัง Unity File Explorer
Hamza Hasan

ฉันมีเกมระบบอนุภาคออกมาในฉาก ไม่ใช่อนุภาค
DarkDestry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.