#c# #unity3d #design-patterns #factory
#c# #unity3d #дизайн-шаблоны #завод
Вопрос:
у меня есть следующий код:
Код товара —
using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class Guns : MonoBehaviour //product { public abstract void shoot(); public GameObject CreateBullet(GameObject bullet) { return Instantiate(bullet, transform.position, Quaternion.identity); } public void ShootBullet(GameObject bullet, Vector3 direction) { bullet.transform.Translate(direction * Time.deltaTime); } }
Код конкретного Продукта 1
using System.Collections; using System.Collections.Generic; using UnityEngine; public class M16 : Guns //ConcreteProduct { [SerializeField] GameObject m16bullet; Vector3 m16bulletdirection = new Vector3(5, 0, 0); public override void shoot() { CreateBullet(m16bullet); ShootBullet(m16bullet, m16bulletdirection); } }
Код конкретного Изделия 2
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Uzi : Guns //ConcreteProduct { [SerializeField] GameObject uzibullet; Vector3 uzibulletdirection = new Vector3(10, 0, 0); public override void shoot() { CreateBullet(uzibullet); ShootBullet(uzibullet, uzibulletdirection); } }
Код создателя
using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class GunCreator : MonoBehaviour //Creator { public abstract Guns GunFactory(); }
Конкретный Код создателя 1
using System.Collections; using System.Collections.Generic; using UnityEngine; public class M16Creator : GunCreator // ConcreteCreator { public override Guns GunFactory() { return new M16(); } }
Конкретный Код создателя 2
using System.Collections; using System.Collections.Generic; using UnityEngine; public class UziCreator : GunCreator // ConcreteCreator { public override Guns GunFactory() { return new Uzi(); } }
и клиентский код, который в настоящее время ничего не делает, так как я не знаю, как сделать пистолет с помощью этого метода. Итак, как все это поможет мне создать новый сборный пистолет с соответствующим кодом на них?
Кроме того, насколько я понимаю, у каждого нового пистолета должен быть класс NewGunCreator, производный от GunCreator, и класс NewGun, производный от Guns. не проще ли было бы исключить классы создателей?
ваше здоровье!
Комментарии:
1. Имеет ли это какой-то смысл? Вы в основном просто реализовали методы, содержащие одну строку … встроенный для каждого вызова API, доступного для класса … почему бы тогда просто не сделать прямой вызов API?
2. Кроме того , поскольку вы здесь имеете дело с
MonoBehaviour
этим, это запрещеноnew M16()
. единственные разрешенные способы создания экземпляровMonoBehaviour
-это черезAddComponent
Instantiate
или конструкторGameObject
3. Что
new Uzi();
на самом деле предполагается делать? Предназначен ли он для создания нового игрового объекта сUzi
прикрепленным к нему сценарием? Предназначено ли это для добавления экземпляраUzi
скрипта к тому же объектуGunCreator
, к которому он прикреплен? Желаемый результат неясен. КакderHugo
сказано,MonoBehiour
s не следует создавать сnew
помощью экземпляра .4. @derHugo спасибо за разъяснение 🙂 @Ruzihm
new Uzi();
должен создать новый игровой объект сUzi
прикрепленным к нему сценарием5.
GunCreator
S понадобилось бы поле, напримерpublic M16 prefab;
, и тогда вы пошлиreturn Instantiate prefab;
бы … все равно: в моих глазах это не имеет никакого смысла … вместо этого вы могли бы напрямую выполнить этот вызов API, не имея для этого фабрики … Фабричный шаблон в основном предназначен для инициализации некоторых внутренних и частных полей и конфигураций, которые должны оставаться скрытыми и неизменяемыми для внешних классов, и запутывать, откуда именно берется этот новый экземпляр и какого именно типа он … На самом деле это не так, как здесь