これ確信じゃないしまだ言語仕様を調べ切ってないんでアレなんですがプリプロセッサの中でプリプロセッサやっても適用されないC#の言語仕様なんじゃないかと思いました。
元々#ifって条件付きコンパイルって意味ですけど#nullable enableもプリプロセッサなので
条件付きコンパイルが適用されないのは凄い自然な気がします。
如何せんコンパイラに対する指示みたいなもんですからね。
質問者さんはその場合言語仕様的に回避が困難な「詰み」の状態にある気がします・・・
逆に言えばUnity2021でもどんな条件付きコンパイルを指定しても#nullable enableが強制的に有効化されるということです。
恐らくUnityバージョンごとにコードを生成するみたいな別の技で回避する必要がありそうです
ものは試しにUnity2019.4とUnity2020.3のエディタを適用に用意してWEBGL指定でビルドするよう指定に#nullableを括ってエディタで実行してみました。
c#
1#if UNITY_WEBGL
2#nullable enable
3#endif
2019.4.40でテストしたけど↑はNGでした
以下のコードはUnity2020.3.43f1ですが
Assets\Test.cs(15,30): warning CS8600: Converting null literal or possible null value to non-nullable type
警告がUnityに出てしまいます、これはプリプロセッサで条件付きコンパイルをしてもプリプロセッサであるnullable enableは無視されてコンパイラに指示がわたることを示唆していると考えられます。
この辺の挙動を解決するハックは私は知らないのでお力にはなれませんが、Unityのコンパイラの仕様だというご賢察は正しいものと思います。
c#
1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4
5
6public class Test : MonoBehaviour
7{
8//本来ならWEBGLでのみビルドされるはず
9#if UNITY_WEBGL
10#nullable enable
11#endif
12 void Start()
13 {
14 string nullTest01 = null;
15 }
16
17}