Просто вставьте свой код в MS Word, выберите его -> затем щелкните правой кнопкой мыши -> Нумерация. В этом случае MS Word будет интерпретировать ваш код как маркер / нумерованный список.
Вот экраны:
Screen1 .
Screen2 .
Думайте о ScriptableObjects как о классе C # с только свойствами и без методов. Они используются в качестве контейнера данных, который можно назначить компонентам игровых объектов через редактор Unity.
В вашей ситуации предположим, что у вас есть сценарий EnemyAI
, прикрепленный к вашему префабу противника. В вашем скрипте EnemyAI
вы делаете что-то вроде этого
public class EnemyAI : MonoBehaviour
{
// The ScriptableObject asset that is assigned through the Unity editor
public EnemyInfo enemyInfo;
private EnemyBehavior currentBehavior;
void Update()
{
// If this agent has no behavior assigned or it has completed its
// previous behavior, choose a new behavior and assign it to this
// agent
if (this.currentBehavior == null)
{
if (Random.Range(0, 1) <= this.enemyInfo.aggressiveness)
{
if (this.enemyInfo.weaponType == "melee")
{
this.currentBehavior = new ChargePlayerBehavior();
}
else if (this.enemyInfo.weaponType == "ranged")
{
this.currentBehavior = new ShootPlayerBehavior();
}
else
{
throw new Exception("This enemy needs a weapon to attack with!")
}
}
else
{
this.currentBehavior = new AvoidPlayerBehavior();
}
}
this.currentBehavior.Update();
}
}
public class EnemyInfo : ScriptableObject
{
public float aggressiveness;
public string weaponType;
// other fields - max health, speed, etc.
}
Затем вы создаете ресурс EnemyInfo
в своем проекте для каждого типа поведения врага. Например:
Затем для каждого префаба противника вы можете подключить один из этих трех EnemyInfo
активов в его [ 115] поле, и это будет диктовать, как действует враг.
Итак, вы в основном удаляете все поля, которые у вас есть в EnemyAI
MonoBehaviour (агрессивность, тип оружия и т. Д.) - и, возможно, максимальное здоровье, скорость и т. Д. В вашем основном Enemy
сценарии - - и перемещение этих полей в ScriptableObject. Или вы можете создать один тип ScriptableObject для параметров искусственного интеллекта противника и один тип ScriptableObject для статистики противника. Таким образом, вы можете делить параметры ИИ между несколькими врагами с разной статистикой.
Даже если ваши значения уникальны для всех врагов, вы на самом деле ничего не теряете (за исключением, может быть, дополнительной работы по созданию ресурсов ScriptableObject). Вы просто помещаете свои вражеские поля данных в ScriptableObject, а не как поля в MonoBehaviour. И в будущем вы можете обнаружить, что хотите повторно использовать поведение противника, например, иметь стандартного солдата и элитного солдата, каждый из которых имеет одинаковые характеристики ИИ.
Преимущества
enemyInfo
. Теперь, если вы решите, что снайпер должен быть более агрессивным, вы можете изменить актив «снайпера» aggressiveness
в редакторе Unity, и он будет применяться ко всем врагам снайперского типа. Альтернативой было бы проходить каждого врага снайперского типа индивидуально и менять всю их агрессивность. Может быть, вы пропустите несколько префабов или, может быть, вы случайно установите разные значения для разных врагов типа снайпер. Вы даже можете сделать это во время тестирования игрового процесса. EnemyInfo
каждому сценарию, вместо того, чтобы иметь несколько разных сценариев для одного врага, у каждого из которых есть свой собственный MaxHealth
], WeaponType
и т. Д. Или наличие сценариев, которые все ссылаются друг на друга для доступа к полям.