В саму суть углубляться я не буду,можно подробно ознакомиться
здесь.
Затрону только часть применимую к Unity.
Здесь можно просмотреть все использующиеся директивы #define в Unity.Что это нам дает.При мультиплатформенном приложении мы можем изолировать часть кода,который не актуален для данной платформы.Например тот же мультитач никоим образом к веб версии не относится.
#if(UNITY_IPHONE)
// Тело логики
#endif
В данном случае логика при компиляции не будет проигнорирована только в случае билда под iPhone.
Параллельно мы так же рассмотрим
RuntimePlatform .Задача та же, изолировать код согласно используемой платформы.
Например
if (Application.platform == RuntimePlatform.IPhonePlayer)
{
//Тело логики
}
Отличие в том,что решение о использовании RuntimePlatform принимается в момент выполнения кода,а директивы препроцессора еще во время его компиляции(код в теле директивы не соответствующей платформы не будет скомпилирован и включен в конечный билд).