using System; using System.Collections; using System.Collections.Generic; using System.Security.Permissions; using UnityEngine; using UnityEngine.Assertions; using UnityEngine.UI; public class ShopViewGrid : ShopView { private GridLayoutGroup _gridLayoutGroup; // This is essentially just a reference to ShopView's layout group but with the correct type protected ViewConfig viewConfig; //To set up the grid view, we need to know how many columns the grid view has, in the current setup, //this information can be found in a ViewConfig scriptable object, which serves as a configuration file for //views. // Start is called before the first frame update protected override void Awake() { viewConfig = Resources.Load("ViewConfig");//Load the ViewConfig scriptable object from the Resources folder Debug.Assert(viewConfig != null); Debug.Assert(_gridLayoutGroup != null); base.Awake(); print("ShopView Grid Initialised"); } protected override void SetupItemIconView() { _gridLayoutGroup.constraint = GridLayoutGroup.Constraint.FixedColumnCount;//Set the constraint mode of the GridLayoutGroup _gridLayoutGroup.constraintCount = viewConfig.gridViewColumnCount; //Set the column count according to the ViewConfig object } protected override void ClearIconView() { Transform[] allIcons = layoutGroup.transform.GetComponentsInChildren(); foreach (Transform child in allIcons) { if (child != layoutGroup.transform) { Destroy(child.gameObject); } } } protected override void AddItemToView(Item item) { GameObject newItemIcon = GameObject.Instantiate(itemPrefab); newItemIcon.transform.SetParent(layoutGroup.transform); newItemIcon.transform.localScale = Vector3.one;//The scale would automatically change in Unity so we set it back to Vector3.one. ViewItemContainer itemContainer = newItemIcon.GetComponent(); Debug.Assert(itemContainer != null); //bool isSelected = (item == model.GetSelectedItem()); var unsub = model.RegisterObserver(itemContainer); itemContainer.Initialize(item,model,unsub); //print("Attempt to add item " + item.name + " to view"); } protected override void RemoveItemFromView(Item item) { var items = layoutGroup.transform.GetComponentsInChildren(); foreach (var itemView in items) { if (itemView.Item == item) { model.RemoveObserver(itemView); Destroy(itemView.gameObject); return; } } } protected override void SwitchToKeyboardControl() { Destroy(shopController);//Remove the current controller component shopController = gameObject.AddComponent().Initialize(model);//Create and add a keyboard controller instructionText.text = "The current control mode is: Keyboard Control, WASD to select item, press K to buy. Press left mouse button to switch to Mouse Control."; buyButton.gameObject.SetActive(false);//Hide the buy button because we only use keyboard } protected override void SwitchToMouseControl() { Destroy(shopController);//Remove the current controller component shopController = gameObject.AddComponent().Initialize(model);//Create and add a mouse controller instructionText.text = "The current control mode is: Mouse Control, press 'K' to switch to Keyboard Control."; buyButton.gameObject.SetActive(true);//Show the buy button for the mouse controler } private void OnValidate() { _gridLayoutGroup = (GridLayoutGroup) layoutGroup; bool correctLayout = _gridLayoutGroup != null; if(!correctLayout) Debug.LogError("Layout group is not of type Grid!",this); //else Debug.Log("Grid shop view validated",this); } }