Ánh sáng và bầu trời
Assets/
Scenes/
Arena.unity
Scripts/
thiết lập dự án
đã có sẵnbài này thêm
Địa hình của bạn đang được chiếu bằng đúng cái Directional Light bạn đã xoay hồi tab 01. Knight đứng trên đó chưa có cái bóng nào ra hồn. Bài này sửa cả hai.
Ánh sáng quyết định cảm giác của game hơn cả model. Mà phần lớn việc đó do một cái Directional Light lo.
Xoay mặt trời là cả không khí, hướng bóng đổ và màu trời đổi theo.
Ba loại đèn bạn sẽ dùng
Directional — mặt trời. Vị trí không quan trọng, chỉ góc xoay có ý nghĩa. Mỗi cảnh một cái.
Point — bóng đèn, toả ra mọi hướng. Đuốc, đèn bàn, quả cầu phép.
Spot — hình nón. Đèn pin, đèn đường, đèn sân khấu.
Thiết lập mặt trời hợp lý
- 1
Rotation 50, -30, 0 — đủ cao để sáng mặt, đủ nghiêng để bóng đổ nhìn ra.
- 2
Intensity khoảng 1.0–1.3, màu trắng hơi ấm (#FFF4E0).
- 3
Shadow Type = Soft Shadows, Strength khoảng 0.8. Bóng đen tuyền trông như lỗi.
Thời gian thực hay bake sẵn
✖ Realtime
Tính lại mỗi khung hình
✓ Baked lightmaps
Tính sẵn, lưu vào texture
- 1
Chọn mọi vật thể không bao giờ di chuyển rồi tick Static ở góc trên phải Inspector. Knight KHÔNG phải vật tĩnh — đừng đụng vào nó.
- 2
Đặt Mode của Directional Light là Mixed: nó bake lên vật tĩnh mà vẫn chiếu sáng nhân vật đang di chuyển.
- 3
Mở rồi bấm Generate Lighting.
- 4
Trong lúc thử nghiệm để Lightmap Resolution 10. Chỉ nâng lên 30–40 cho lần bake cuối.
Bầu trời, ánh sáng môi trường và sương mù
Skybox không chỉ là phông nền — nó là nguồn ánh sáng môi trường chính chiếu lên mọi bề mặt.
Ở Lighting > Environment, đặt Ambient Source = Skybox với Intensity 0.8–1.0 cho ánh sáng phụ tự nhiên trong vùng tối.
Sương che mặt phẳng cắt xa và cho phép giảm khoảng Far của camera — vừa đẹp vừa được thêm hiệu năng.
Chọn màu sương khớp với màu chân trời của skybox, không thì lộ vết ghép rất rõ.
Chu kỳ ngày đêm trong 12 dòng
using UnityEngine;
public class DayNight : MonoBehaviour
{
[SerializeField] private float dayLengthMinutes = 4f;
[SerializeField] private Gradient sunColor; //0 lúc đêm, 1 lúc trưa
[SerializeField] private AnimationCurve intensity;
private Light sun;
private float t; // từ 0 tới 1 cho trọn một ngày
void Awake() => sun = GetComponent<Light>();
void Update()
{
t += Time.deltaTime / (dayLengthMinutes * 60f);
t %= 1f;
transform.rotation = Quaternion.Euler((t * 360f) - 90f, 30f, 0f);
sun.color = sunColor.Evaluate(t);
sun.intensity = intensity.Evaluate(t);
RenderSettings.ambientIntensity = Mathf.Lerp(0.2f, 1f, sun.intensity);
}
}