|
3 | 3 | using UnityEngine.Scripting.APIUpdating;
|
4 | 4 | using UnityEngine.U2D;
|
5 | 5 | using UnityEngine.Rendering.RenderGraphModule;
|
| 6 | +using System.Collections.Generic; |
6 | 7 | #if UNITY_EDITOR
|
7 | 8 | using System.Linq;
|
8 | 9 | #endif
|
@@ -180,7 +181,6 @@ private enum ComponentVersions
|
180 | 181 | // We use Blue Channel of LightMesh's vertex color to indicate Slot Index.
|
181 | 182 | int m_BatchSlotIndex = 0;
|
182 | 183 | internal int batchSlotIndex { get { return m_BatchSlotIndex; } set { m_BatchSlotIndex = value; } }
|
183 |
| - internal int[] affectedSortingLayers => m_ApplyToSortingLayers; |
184 | 184 |
|
185 | 185 | private int lightCookieSpriteInstanceID => lightCookieSprite?.GetInstanceID() ?? 0;
|
186 | 186 |
|
@@ -338,6 +338,96 @@ public LightType lightType
|
338 | 338 | /// </summary>
|
339 | 339 | public bool renderVolumetricShadows => volumetricShadowsEnabled && shadowVolumeIntensity > 0;
|
340 | 340 |
|
| 341 | + /// <summary> |
| 342 | + /// Gets or sets the target sorting layers for the light. Contains an array of sorting layer IDs. |
| 343 | + /// </summary> |
| 344 | + public int[] targetSortingLayers |
| 345 | + { |
| 346 | + get => m_ApplyToSortingLayers; |
| 347 | + set |
| 348 | + { |
| 349 | + var layers = new List<int>(); |
| 350 | + foreach (var layerID in value) |
| 351 | + { |
| 352 | + if (SortingLayer.IsValid(layerID)) |
| 353 | + layers.Add(layerID); |
| 354 | + } |
| 355 | + m_ApplyToSortingLayers = layers.ToArray(); |
| 356 | + } |
| 357 | + } |
| 358 | + |
| 359 | + bool IsValidLayer(string name) |
| 360 | + { |
| 361 | + // Have this check as SortingLayer.NameToID returns 0 (default layer) if layer is not found |
| 362 | + foreach (var layer in Light2DManager.GetCachedSortingLayer()) |
| 363 | + { |
| 364 | + if (layer.name == name) |
| 365 | + return true; |
| 366 | + } |
| 367 | + |
| 368 | + return false; |
| 369 | + } |
| 370 | + |
| 371 | + /// <summary> |
| 372 | + /// Adds a target sorting layer to the light. |
| 373 | + /// </summary> |
| 374 | + /// <param name="layerName">The sorting layer name to be added.</param> |
| 375 | + /// <returns>Returns true if the sorting layer is added. Returns false if the layer name is invalid or has already been added.</returns> |
| 376 | + public bool AddTargetSortingLayer(string layerName) |
| 377 | + { |
| 378 | + var layers = new List<int>(m_ApplyToSortingLayers); |
| 379 | + var id = SortingLayer.NameToID(layerName); |
| 380 | + |
| 381 | + // Invalid or duplicate layerID |
| 382 | + if (!IsValidLayer(layerName) || layers.Contains(id)) |
| 383 | + return false; |
| 384 | + |
| 385 | + layers.Add(id); |
| 386 | + m_ApplyToSortingLayers = layers.ToArray(); |
| 387 | + |
| 388 | + return true; |
| 389 | + } |
| 390 | + |
| 391 | + /// <summary> |
| 392 | + /// Adds a target sorting layer to the light. |
| 393 | + /// </summary> |
| 394 | + /// <param name="layerID">The sorting layer ID to be added.</param> |
| 395 | + /// <returns>Returns true if the sorting layer is added. Returns false if the layer ID is invalid or has already been added.</returns> |
| 396 | + public bool AddTargetSortingLayer(int layerID) |
| 397 | + { |
| 398 | + return AddTargetSortingLayer(SortingLayer.IDToName(layerID)); |
| 399 | + } |
| 400 | + |
| 401 | + /// <summary> |
| 402 | + /// Removes a target sorting layer from the light. |
| 403 | + /// </summary> |
| 404 | + /// <param name="layerName">The sorting layer name to be removed.</param> |
| 405 | + /// <returns>Returns true if the sorting layer is removed. Returns false if the layer name is invalid or doesn't exist.</returns> |
| 406 | + public bool RemoveTargetSortingLayer(string layerName) |
| 407 | + { |
| 408 | + var layers = new List<int>(m_ApplyToSortingLayers); |
| 409 | + var id = SortingLayer.NameToID(layerName); |
| 410 | + |
| 411 | + // Invalid or layerID does not exist |
| 412 | + if (!IsValidLayer(layerName) || !layers.Contains(id)) |
| 413 | + return false; |
| 414 | + |
| 415 | + layers.Remove(id); |
| 416 | + m_ApplyToSortingLayers = layers.ToArray(); |
| 417 | + |
| 418 | + return true; |
| 419 | + } |
| 420 | + |
| 421 | + /// <summary> |
| 422 | + /// Removes a target sorting layer from the light. |
| 423 | + /// </summary> |
| 424 | + /// <param name="layerID">The sorting layer ID to be removed.</param> |
| 425 | + /// <returns>Returns true if the sorting layer is removed. Returns false if the layer ID is invalid or doesn't exist.</returns> |
| 426 | + public bool RemoveTargetSortingLayer(int layerID) |
| 427 | + { |
| 428 | + return RemoveTargetSortingLayer(SortingLayer.IDToName(layerID)); |
| 429 | + } |
| 430 | + |
341 | 431 | internal void MarkForUpdate()
|
342 | 432 | {
|
343 | 433 | forceUpdate = true;
|
|
0 commit comments