Итак, я настраивал этот тест для реализации шаблона наилегчайшего веса. Здесь я создаю объектный класс и фабрику, чтобы порождать один и тот же объект с разными свойствами, в данном случае цветом, размером и формой. Итак, у меня есть раскрывающееся меню для каждого свойства и кнопка для создания объекта. Я хочу использовать функцию getobject в фабричном классе для создания объекта, но не могу создать его правильно. Я получил форму, но не цвет и размер. Это как-то связано с параметрами, которые я установил для функции. Я не хочу просто делать то, что делаю сейчас, чтобы порождать кубики и цилиндры. Это просто тест. Если кто-то может придумать способ обойти это, я ценю это, спасибо.
public class FlyWeight : MonoBehaviour
{
public Button CreateButton;
List<string> colors = new List<string>() { "Choose Color", "Red", "Blue", "Green" };
List<string> shapes = new List<string>() { "Choose Shape", "Sphere", "Cube", "Cylinder" };
List<string> sizes = new List<string>() { "Choose Size", "Small", "Medium", "Large" };
public Dropdown Shapes;
public Dropdown Colors;
public Dropdown Sizes;
private void Start()
{
Button button = CreateButton.GetComponent<Button>();
Shapes.AddOptions(shapes);
Colors.AddOptions(colors);
Sizes.AddOptions(sizes);
}
public void TaskOnClick()
{
if (Shapes.value == 1)
{
var sphere= Factory.getObject(GameObject.CreatePrimitive(PrimitiveType.Sphere), getSize(), getColor());
}
else if (Shapes.value == 2)
{
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.GetComponent<Renderer>().material.color = getColor();
cube.transform.localScale = getSize();
}
else if (Shapes.value == 3)
{
var cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
cylinder.GetComponent<Renderer>().material.color = getColor();
cylinder.transform.localScale = getSize();
}
}
public Color getColor()
{
if (Colors.value == 1) { return Color.red; }
else if (Colors.value == 2) { return Color.blue; }
else if (Colors.value == 3) { return Color.green; }
else return Color.white;
}
public Vector3 getSize()
{
if (Sizes.value == 1) { return gameObject.transform.localScale = new Vector3(1, 1, 1); }
else if (Sizes.value == 2) { return gameObject.transform.localScale = new Vector3(2, 2, 2); }
else { return gameObject.transform.localScale = new Vector3(3, 3, 3); }
}
}
Класс объекта
public class Object
{
private Color color;
private Vector3 size;
private GameObject shape;
private int x, y;
public Object (GameObject shape, Vector3 size,Color color)
{
this.color = color;
this.size = size;
this.shape = shape;
}
public void setX(int x) { this.x = x; }
public void setY(int y) { this.y = y; }
}
Заводской класс
public class Factory
{
private static List<Object> objects = new List<Object>();
public static Object getObject(GameObject shape,Vector3 size, Color color)
{
Object obj = null;
if (obj == null)
{
obj = new Object(shape, size, color);
objects.Add(obj);
}
return obj;
}
}
Ага. Я не получаю ошибок.
Вы хотите вернуть только вектор из этой функции? Потому что то, что вы написали, не похоже на предполагаемое использование
да я просто хочу вернуть вектор
Тогда не включайте gameObject.transform.localScale = . Также вам не нужна линия Button button = CreateButton.GetComponent<Button>();. CreateButton сделает ту же работу
Было бы так? общедоступный Vector3 getSize () {если (Sizes.value == 1) {вернуть новый Vector3 (1, 1, 1); } else if (Sizes.value == 2) {return new Vector3 (2, 2, 2); } else {вернуть новый Vector3 (3, 3, 3); }}
Верный. Сделайте Console.Log(getColor()) и Console.Log(getSize()), чтобы убедиться, что вы получаете правильные вещи, прежде чем создавать объект и публиковать его в качестве редактирования, пожалуйста.
Где бы я это разместил? Это не сработает с параметрами, и я не пытаюсь использовать их вне фабричного класса.
Поместите его в верхней части вашего метода TaskOnClick () перед оператором if просто в качестве шага отладки, чтобы убедиться, что ваши раскрывающиеся списки отправляют правильные значения, и чтобы выяснить, находится ли он в другой части вашей программы.
Проходит, он говорит: '(1.0,1.0,1.0) UnityEngine.Debug :: Log (Object)
Размер еще не изменился так, как вы этого хотите?
Позвольте нам продолжить обсуждение в чате.
Нет. Это работает, когда я делаю это, как с кубиками и цилиндрами, но я хочу делать это так же, как со сферами.





Ваш метод getSize () пытается вернуть назначение, а не Vector3, компилируется ли это?