10個遊戲案例總結
阿新 • • 發佈:2018-08-08
null 設置 none camera art npr nis als star
1.拼圖遊戲開始位置是正確位置。
2.設置很多狀態枚舉,舉明當前狀態和下一個狀態,在update裏面開始swich case 指明狀態和下一個狀態。
3.狀態遷移還有初始化的處理啊
// 狀態遷移時的初始化處理 while(this.next_step != STEP.NONE) { this.step = this.next_step; this.next_step = STEP.NONE; switch(this.step) { case STEP.IDLE: {this.SetHeightOffset(this.height_offset); } break; case STEP.RESTART: { this.transform.position = this.start_position; this.SetHeightOffset(this.height_offset); this.next_step = STEP.IDLE; }break; case STEP.DRAGING: { this.begin_dragging(); // 將拖動開始事件通知給拼圖管理類 this.pazzle_control.PickPiece(this); this.game_control.playSe(GameControl.SE.GRAB); }break; case STEP.FINISHED: { // 靠近正解位置不遠處松開 // 吸附到正解位置 this.transform.position = this.finished_position; // 通知拼圖管理類將這個碎片放置到正解的位置 this.pazzle_control.FinishPiece(this); } break; } }
4.3d焦點的處理
// 將鼠標的位置,變換為3D空間內的世界坐標 // // ?穿過鼠標光標和攝像機位置的直線 // ? 用於判定是否和地面碰撞的平面 // 求出↑二者的交點 // public bool unproject_mouse_position(out Vector3 world_position, Vector3 mouse_position) { bool ret; float depth; // 通過碎片中心的水平(法線為Y軸,XZ平面)面 Plane plane = new Plane(Vector3.up, new Vector3(0.0f, this.transform.position.y, 0.0f)); // 穿過攝像機位置和鼠標光標位置的直線 Ray ray = this.game_camera.GetComponent<Camera>().ScreenPointToRay(mouse_position); // 求出上面二者的交點 if(plane.Raycast(ray, out depth)) { world_position = ray.origin + ray.direction*depth; ret = true; } else { world_position = Vector3.zero; ret = false; } return(ret); }
5.制定了繪制順序
-
private void set_height_offset_to_pieces() { float offset = 0.01f; int n = 0; foreach(PieceControl piece in this.active_pieces) { if(piece == null) { continue; } // 指定繪制的順序 // pieces 中越前面的碎片=越靠近上方的碎片被繪制的順序越晚 // piece.GetComponent<Renderer>().material.renderQueue = this.GetDrawPriorityPiece(n); // 為了能夠使點擊時位於最上方的碎片的 OnMouseDown() 方法被調用, // 指定Y軸高度的偏移 // (不這樣處理的話可能會由於繪制優先度的關系而導致下面的碎片響應了點擊) offset -= 0.01f/this.piece_num; piece.SetHeightOffset(offset); // n++; } }
10個遊戲案例總結