// 通过一个棋子模板初始化一个棋子物体的state组件 public void Initialize(GameObject ParaChessBoard, Vector2Int InterCoord, Piece PieceTamplate) { // 为棋子物体的state组件初始化所有位置信息 ChessBoardInternalCoordinate = InterCoord; ChessBoardInternalPosition = ParaChessBoard.GetComponent <ChessBoardController>().GetCheckerboardPosition(InterCoord); ChessBoardOuterCoordinate = ParaChessBoard.GetComponent <ChessBoardController>().ChessBoardOuterCoordinate; LocateChessboard = ParaChessBoard; PieceInfoController ThisPieceInfoController = this.GetComponent <PieceInfoController>(); // 为棋子物体的state组件初始化所有基础属性 ThisPieceInfoController.SetPieceID(PieceTamplate.GetPieceID()); ThisPieceInfoController.SetPieceName(PieceTamplate.GetPieceName()); ThisPieceInfoController.SetPieceCostMineral(PieceTamplate.GetPieceMineralCost()); ThisPieceInfoController.SetPieceCostGas(PieceTamplate.GetPieceGasCost()); SetRetreatThreshold(PieceTamplate.GetRetreatThreshold()); SetCardMainImage(PieceTamplate.GetCardMainImage()); SetUnitIconImage(PieceTamplate.GetUnitIconImage()); SetCardDescriptionItemList(PieceTamplate.GetCardDescriptionItemList()); PieceDeathEffect = PieceTamplate.GetPieceDeathEffect(); // 为棋子物体的state组件初始化所有棋子应该包含的单位 for (int i = 0; i < PieceTamplate.GetUnitTypeNum(); i++) { for (int j = 0; j < PieceTamplate.GetUnitNum(i); j++) { Unit NewUnit = new Unit(); // 根据单位模板将单位初始化为预定单位 NewUnit.InitialUnit(PieceTamplate.GetUnitTamplate(i)); // 设置单位所在的棋子引用 NewUnit.SetLocatePiece(this.transform.parent.gameObject); // 将新生成的单位添加入棋子单位字典中 InitialUnit(NewUnit); } } // 加载棋子默认棋子底座 MainPiecePedestalInfo = PieceTamplate.GetPiecePedestalInfo(); if (MainPiecePedestalInfo != null) { MainPiecePedestal = MainPiecePedestalInfo.LoadPedestal(this.transform.parent.gameObject); } MainPieceStatusInfo = PieceTamplate.GetPieceStatusInfo(); if (MainPieceStatusInfo != null) { MainPieceStatus = MainPieceStatusInfo.LoadStatus(this.transform.parent.gameObject, MainPiecePedestal); } // 初始化棋子UI this.GetComponent <PieceUIController>().InitializePieceUI(); }
// Use this for initialization void Start() { ClientManager = GameObject.Find("ClientManager"); ThisPieceStateController = this.GetComponent <PieceStateController>(); ThisPieceInfoController = this.GetComponent <PieceInfoController>(); //ChessBoardManager = GameObject.Find("ChessBoardManager"); //CheckerBoardSize = LocateChessboard.GetComponent<ChessBoardInfoController>().CheckerBoardSize; //ChessBoardSize = LocateChessboard.GetComponent<ChessBoardInfoController>().ChessBoardSize; //GeneratePositionX = LocateChessboard.GetComponent<ChessBoardInfoController>().ChessBoardOuterPosition.x; //GeneratePositionZ = LocateChessboard.GetComponent<ChessBoardInfoController>().ChessBoardOuterPosition.y; //InitPosition = LocateChessboard.GetComponent<ChessBoardInfoController>().InitPosition; // 载入可操作目标预制体 OperatbleTargetPrefab = (GameObject)Resources.Load("Prefabs/OperatbleTarget"); HintTargetPrefab = (GameObject)Resources.Load("Prefabs/HintTarget"); //ThisPieceStateController = this.transform.parent.GetComponent<PieceStateController>(); if (OperatbleTargetPrefab == null) { Debug.Log("OperatbleTargetPrefab load fail"); } // TODO: 动态调整可操作目标数组的长度 OperatblePreviews = new GameObject[10]; HintPreviews = new GameObject[20]; AttackTargets = new GameObject[20]; MoveDirectionX[0] = 1; MoveDirectionY[0] = 1; MoveDirectionX[1] = 1; MoveDirectionY[1] = 0; MoveDirectionX[2] = 1; MoveDirectionY[2] = -1; MoveDirectionX[3] = 0; MoveDirectionY[3] = -1; MoveDirectionX[4] = -1; MoveDirectionY[4] = -1; MoveDirectionX[5] = -1; MoveDirectionY[5] = 0; MoveDirectionX[6] = -1; MoveDirectionY[6] = 1; MoveDirectionX[7] = 0; MoveDirectionY[7] = 1; }
// 通过一个棋子模板初始化一个位于棋盘外(尚未被部署到棋盘上的)棋子物体的state组件 public void Initialize(Piece PieceTamplate) { PieceInfoController ThisPieceInfoController = this.GetComponent <PieceInfoController>(); // 为棋子物体的state组件初始化所有基础属性 ThisPieceInfoController.SetPieceID(PieceTamplate.GetPieceID()); ThisPieceInfoController.SetPieceName(PieceTamplate.GetPieceName()); ThisPieceInfoController.SetPieceCostMineral(PieceTamplate.GetPieceMineralCost()); ThisPieceInfoController.SetPieceCostGas(PieceTamplate.GetPieceGasCost()); SetRetreatThreshold(PieceTamplate.GetRetreatThreshold()); SetCardMainImage(PieceTamplate.GetCardMainImage()); SetUnitIconImage(PieceTamplate.GetUnitIconImage()); SetCardDescriptionItemList(PieceTamplate.GetCardDescriptionItemList()); PieceDeathEffect = PieceTamplate.GetPieceDeathEffect(); this.transform.parent.name = PieceTamplate.GetPieceName(); // 为棋子物体的state组件初始化所有棋子应该包含的单位 for (int i = 0; i < PieceTamplate.GetUnitTypeNum(); i++) { for (int j = 0; j < PieceTamplate.GetUnitNum(i); j++) { Unit NewUnit = new Unit(); // 根据单位模板将单位初始化为预定单位 NewUnit.InitialUnit(PieceTamplate.GetUnitTamplate(i)); // 设置单位所在的棋子引用 NewUnit.SetLocatePiece(this.transform.parent.gameObject); // 将新生成的单位添加入棋子单位字典中 InitialUnit(NewUnit); } } // 加载棋子默认棋子底座 MainPiecePedestalInfo = PieceTamplate.GetPiecePedestalInfo(); if (MainPiecePedestalInfo != null) { MainPiecePedestal = MainPiecePedestalInfo.LoadPedestal(this.transform.parent.gameObject); } MainPieceStatusInfo = PieceTamplate.GetPieceStatusInfo(); if (MainPieceStatusInfo != null) { MainPieceStatus = MainPieceStatusInfo.LoadStatus(this.transform.parent.gameObject, MainPiecePedestal); } // 取消当前棋子的碰撞体并且将整体隐藏(棋子本体以及棋子UI) this.GetComponent <CapsuleCollider>().enabled = false; this.transform.parent.gameObject.SetActive(false); //this.GetComponent<PieceUIController>().HidePieceUIBase(); // 初始化棋子UI //this.GetComponent<PieceUIController>().InitializePieceUI(); // 隐藏棋子UI //this.GetComponent<PieceUIController>().HidePieceUIBase(); }
// 将一个棋子当前的状态信息装入展示卡牌当中 public void LoadInfoFromPiece(GameObject ParaPiece) { PieceInfoController ParaPieceInfoController = ParaPiece.GetComponentInChildren <PieceInfoController>(); PieceStateController ParaPieceStateController = ParaPiece.GetComponentInChildren <PieceStateController>(); CardNameText.GetComponent <Text>().text = ParaPieceInfoController.GetPieceName(); if (ParaPieceStateController.GetCardMainImage() != null) { MainImage.GetComponent <RawImage>().texture = ParaPieceStateController.GetCardMainImage(); } else { } //MainImage.GetComponent<RawImage>().texture = // 也许在单位数目为1的时候英雄棋子和普通杂兵棋子需要区别对待(英雄类棋子直接隐藏单位数目图标和单位数目文本) PieceUnitNumText.GetComponent <Text>().text = (ParaPieceStateController.GetAliveUnitNum()).ToString(); MineralText.GetComponent <Text>().text = (ParaPieceInfoController.GetPieceCostMineral()).ToString(); GasText.GetComponent <Text>().text = (ParaPieceInfoController.GetPieceCostGas()).ToString(); List <string> CardDescriptionItemList = ParaPieceStateController.GetCardDescriptionItemList(); int CharacterNum = 0; if (CardDescriptionItemList != null) { //Debug.Log("get it"); for (int i = 0; i < CardDescriptionItemList.Count; i++) { CharacterNum += CardDescriptionItemList[i].Length; } // 如果描述项字符总量过多则需要调整文本中的字体大小 if (CharacterNum <= 56) { string Res = ""; // 组装卡牌描述区文本,每个描述项之间用一个空格隔开 for (int i = 0; i < CardDescriptionItemList.Count; i++) { if (i == CardDescriptionItemList.Count - 1) { Res += CardDescriptionItemList[i]; } else { Res += (CardDescriptionItemList[i] + " "); } } // 将卡牌描述区文本设置到text属性 CardDescription.transform.Find("CardDescriptionText").gameObject.GetComponent <Text>().text = Res; } } // 更新生命值状态条 float HealthPercentage = ParaPieceStateController.GetRationOfHealth(); float HealthBarWidth = 145 * HealthPercentage; float HealthBarPosition = 145 * (1 - HealthPercentage); HealthBar.GetComponent <RectTransform>().sizeDelta = new Vector2(HealthBarWidth, 6); HealthBar.GetComponent <RectTransform>().localPosition = new Vector3((float)(HealthBarPosition / 2.0), 0, 0); }
// 鼠标左键点选棋子后在主场景中显示所有的 可移动位置 和 可攻击位置 public void OperationPreview() { PreviewIndex = 0; ThisPieceStateController = this.GetComponent <PieceStateController>(); ThisPieceInfoController = this.GetComponent <PieceInfoController>(); ThisPieceStateController.DisplayAllUnit(); GameObject LocateChessboard = ThisPieceStateController.LocateChessboard; CheckerBoardSize = LocateChessboard.GetComponent <ChessBoardController>().CheckerBoardSize; ChessBoardSize = LocateChessboard.GetComponent <ChessBoardController>().ChessBoardSize; //GeneratePositionX = LocateChessboard.GetComponent<ChessBoardInfoController>().ChessBoardOuterPosition.x; //GeneratePositionZ = LocateChessboard.GetComponent<ChessBoardInfoController>().ChessBoardOuterPosition.y; //InitPosition = LocateChessboard.GetComponent<ChessBoardInfoController>().InitPosition; //Debug.Log("233"); this.GetComponent <MeshRenderer>().material = PieceSelectedMaterial; if (this.GetComponent <PieceInfoController>().HasOrientation == false) { // 获取该棋子在棋盘中的坐标 Vector2Int CurrentCoordinate = ThisPieceStateController.ChessBoardInternalCoordinate; // 进行常规移动位置计算 for (int i = 0; i < 8; i++) { for (int j = 1; j <= ThisPieceInfoController.BaseMoveAbility[i]; j++) { Vector2Int NewInterCoord = new Vector2Int(); Vector2Int NewOuterCoord = new Vector2Int(); Vector2Int ParaInterCoord = new Vector2Int(CurrentCoordinate.x + j * MoveDirectionX[i], CurrentCoordinate.y + j * MoveDirectionY[i]); if (CheckerBoardAvaliable(ParaInterCoord, out NewInterCoord, out NewOuterCoord) == true) { GenerateHintTarget(NewInterCoord, NewOuterCoord, 1); GenerateOperatableTarget(NewInterCoord, NewOuterCoord); } } } // 进行特殊移动位置计算 // 进行常规攻击位置计算 for (int i = 0; i < 8; i++) { for (int j = 1; j <= ThisPieceInfoController.BaseAttackAbility[i]; j++) { Vector2Int NewInterCoord = new Vector2Int(); Vector2Int NewOuterCoord = new Vector2Int(); Vector2Int ParaInterCoord = new Vector2Int((int)CurrentCoordinate.x + j * MoveDirectionX[i], (int)CurrentCoordinate.y + j * MoveDirectionY[i]); if (CheckerBoardAvaliable(ParaInterCoord, out NewInterCoord, out NewOuterCoord) == true) { GenerateHintTarget(NewInterCoord, NewOuterCoord, 2); //GenerateOperatableTarget(NewInterCoord, NewOuterCoord); GameObject AttackTargetPiece = GetCheckerPiece(NewInterCoord, NewOuterCoord); if (AttackTargetPiece != null) { //Debug.Log(AttackTargetPiece.name); AttackTargets[AttackTargetIndex++] = AttackTargetPiece; AttackTargetPiece.GetComponentInChildren <PieceStateController>().IsAttackTarget = true; } } } } } else { } }