First
How do I use First
Below are practical examples compiled from projects for learning and reference purposes
Featured Snippets
File name: PhotonConverter.cs
Copy
351 static int ConvertNetworkView(NetworkView[] netViews, bool isScene)
352 {
353 for (int i = netViews.Length - 1; i >= 0; i--)
354 {
355 NetworkView netView = netViews[i];
356 PhotonView view = netView.gameObject.AddComponent
357 if (isScene)
358 {
359 //Get scene ID
360 string str = netView.viewID.ToString().Replace("SceneID: ", "");
361 int firstSpace = str.IndexOf(" ");
362 str = str.Substring(0, firstSpace);
363 int oldViewID = int.Parse(str);
364
365 view.viewID = oldViewID;
366 EditorUtility.SetDirty(view);
367 EditorUtility.SetDirty(view.gameObject);
368 }
369 view.observed = netView.observed;
370 if (netView.stateSynchronization == NetworkStateSynchronization.Unreliable)
371 {
372 view.synchronization = ViewSynchronization.Unreliable;
373 }
374 else if (netView.stateSynchronization == NetworkStateSynchronization.ReliableDeltaCompressed)
375 {
376 view.synchronization = ViewSynchronization.ReliableDeltaCompressed;
377 }
378 else
379 {
380 view.synchronization = ViewSynchronization.Off;
381 }
382 DestroyImmediate(netView, true);
383 }
384 AssetDatabase.Refresh();
385 AssetDatabase.SaveAssets();
386
387 return netViews.Length;
388 }
File name: PhotonViewInspector.cs
Copy
209 void DrawOldObservedItem()
210 {
211 EditorGUILayout.BeginHorizontal();
212
213 // Using a lower version then 3.4? Remove the TRUE in the next line to fix an compile error
214 string typeOfObserved = string.Empty;
215 if( m_Target.observed != null )
216 {
217 int firstBracketPos = m_Target.observed.ToString().LastIndexOf( '(' );
218 if( firstBracketPos > 0 )
219 {
220 typeOfObserved = m_Target.observed.ToString().Substring( firstBracketPos );
221 }
222 }
223
224
225 Component componenValue = (Component)EditorGUILayout.ObjectField( "Observe: " + typeOfObserved, m_Target.observed, typeof( Component ), true );
226 if( m_Target.observed != componenValue )
227 {
228 if( m_Target.observed == null )
229 {
230 m_Target.synchronization = ViewSynchronization.UnreliableOnChange; // if we didn't observe anything yet. use unreliable on change as default
231 }
232 if( componenValue == null )
233 {
234 m_Target.synchronization = ViewSynchronization.Off;
235 }
236
237 m_Target.observed = componenValue;
238 }
239
240 EditorGUILayout.EndHorizontal();
241 }
File name: NetworkingPeer.cs
Copy
3339 private void OnSerializeRead(Hashtable data, PhotonPlayer sender, int networkTime, short correctPrefix)
3340 {
3341 // read view ID from key (byte)0: a int-array (PUN 1.17++)
3342 int viewID = (int)data[(byte)0];
3343
3344
3345 PhotonView view = this.GetPhotonView(viewID);
3346 if (view == null)
3347 {
3348 Debug.LogWarning("Received OnSerialization for view ID " + viewID + ". We have no such PhotonView! Ignored this if you're leaving a room. State: " + this.State);
3349 return;
3350 }
3351
3352 if (view.prefix > 0 && correctPrefix != view.prefix)
3353 {
3354 Debug.LogError("Received OnSerialization for view ID " + viewID + " with prefix " + correctPrefix + ". Our prefix is " + view.prefix);
3355 return;
3356 }
3357
3358 // SetReceiving filtering
3359 if (view.group != 0 && !this.allowedReceivingGroups.Contains(view.group))
3360 {
3361 return; // Ignore group
3362 }
3363
3364
3365 if (view.synchronization == ViewSynchronization.ReliableDeltaCompressed)
3366 {
3367 if (!this.DeltaCompressionRead(view, data))
3368 {
3369 // Skip this packet as we haven't got received complete-copy of this view yet.
3370 if (PhotonNetwork.logLevel >= PhotonLogLevel.Informational)
3371 Debug.Log("Skipping packet for " + view.name + " [" + view.viewID + "] as we haven't received a full packet for delta compression yet. This is OK if it happens for the first few frames after joining a game.");
3372 return;
3373 }
3374
3375 // store last received for delta-compression usage
3376 view.lastOnSerializeDataReceived = data[(byte)1] as object[];
3377 }
3378
3379 if (sender.ID != view.ownerId)
3380 {
3381 if (!view.isSceneView || !sender.isMasterClient)
3382 {
3383 // obviously the owner changed and we didn't yet notice.
3384 Debug.Log("Adjusting owner to sender of updates. From: " + view.ownerId + " to: " + sender.ID);
3385 view.ownerId = sender.ID;
3386 }
3387 }
3388
3389 object[] contents = data[(byte)1] as object[];
3390 PhotonStream pStream = new PhotonStream(false, contents);
3391 PhotonMessageInfo info = new PhotonMessageInfo(sender, networkTime, view);
3392
3393 view.DeserializeView( pStream, info );
3394 }
File name: PhotonView.cs
Copy
176 public int instantiationId; // if the view was instantiated with a GO, this GO has a instantiationID (first view's viewID)
185 {
186 get { return this.CreatorActorNr == 0; }
187 }
File name: ConnectAndJoinRandom.cs
Copy
37 public virtual void OnConnectedToMaster()
38 {
39 if (PhotonNetwork.networkingPeer.AvailableRegions != null) Debug.LogWarning("List of available regions counts " + PhotonNetwork.networkingPeer.AvailableRegions.Count + ". First: " + PhotonNetwork.networkingPeer.AvailableRegions[0] + " \t Current Region: " + PhotonNetwork.networkingPeer.CloudRegion);
40 Debug.Log("OnConnectedToMaster() was called by PUN. Now this client is connected and could join a room. Calling: PhotonNetwork.JoinRandomRoom();");
41 PhotonNetwork.JoinRandomRoom();
42 }
File name: Scores.cs
Copy
34 void GameStartedFirstTime() {
35 if(!PlayerPrefs.HasKey ("isGameStartedFirstTime")) {
36 PlayerPrefs.SetInt (BEST_SCORE, 0);
37 PlayerPrefs.SetInt (BEST_COIN_SCORE, 0);
38 PlayerPrefs.SetInt ("isGameStartedFirstTime", 0);
39
40 }
41 }
File name: GameControllerScript.cs
Copy
248 private void adjustConnectors() {
249 int j, k, axis;
250 ConnectorScript connectorScript;
251 bool show;
252// for (j = 0; j <= 2; j++) {
253// for (k = 0; k <= 2; k++) {
254// for (axis = 0; axis <= 2; axis++) {
255// connectorScript = this.connectors[j,k,axis].gameObject.GetComponent("ConnectorScript") as ConnectorScript;
256// connectorScript.show = true;
257//
258// if (this.options.board_type == "Hollow Cube") {
259// if(j == 1 & k == 1) {
260// connectorScript.show = false;
261// }
262// }
263//
264// if (this.options.board_type == "Box Outline") { //Box Outline
265// if(j == 1 || k == 1) {
266// connectorScript.show = false;
267// }
268// }
269//
270// if (this.options.board_type == "Four Walls") {
271// //remove center connector on the x axis
272// if(axis == 0 && j == 1 & k == 1) {
273// connectorScript.show = false;
274// }
275// //remove 3 center connectors on the y axis
276// if(axis == 1 && j == 1) {
277// connectorScript.show = false;
278// }
279// //remove 3 center connectors on the z axis
280// if(axis == 2 && k == 1) {
281// connectorScript.show = false;
282// }
283// }
284//
285//
286// if (this.options.board_type == "No Corners") {
287// if(j != 1 && k != 1) {
288// connectorScript.show = false;
289// }
290// }
291// }}}
292 }
293
294 public bool doMove (string axis, int direction) {
295 int loop1, loop2; //looping variables
296 int x, y, z; //block location variables
297 int numMoves = 0; //number of moves to make
298 int scoreChange = 0;
299 bool blockCollision = false;
300 bool blockCollisionSound = false;
301 Transform blockA, blockB, blockC; //variables for holding the three blocks in a row
302 IDictionary
303 IDictionary
304 int[,,] numbersAfterMove = new int[3,3,3];
305;
306 if (PlayerPrefs.GetString ("game_status") != "playing") return false;
307 if (this.gameView != "game") return false;
308
309 //loop through each of the 9 rows to be calculated
310 for(loop1 = 0; loop1 <=2; loop1++) {
311 for(loop2 = 0; loop2 <=2; loop2++) {
312 if (axis == "x") {
313 y = loop1;
314 z = loop2;
315 if (direction == 1) {
316 blockA= this.blocks[0,y,z];
317 blockB= this.blocks[1,y,z];
318 blockC= this.blocks[2,y,z];
319 }
320 else {
321 blockA= this.blocks[2,y,z];
322 blockB= this.blocks[1,y,z];
323 blockC= this.blocks[0,y,z];
324 }
325 }
326 else if (axis == "y") {
327 x = loop1;
328 z = loop2;
329 if (direction == 1) {
330 blockA= this.blocks[x,0,z];
331 blockB= this.blocks[x,1,z];
332 blockC= this.blocks[x,2,z];
333 }
334 else {
335 blockA= this.blocks[x,2,z];
336 blockB= this.blocks[x,1,z];
337 blockC= this.blocks[x,0,z];
338 }
339 }
340 else {
341 x = loop1;
342 y = loop2;
343 if (direction == 1) {
344 blockA= this.blocks[x,y,0];
345 blockB= this.blocks[x,y,1];
346 blockC= this.blocks[x,y,2];
347 }
348 else {
349 blockA= this.blocks[x,y,2];
350 blockB= this.blocks[x,y,1];
351 blockC= this.blocks[x,y,0];
352 }
353 }
354 calculateRowChanges(this.getBlockNumber(blockA), this.getBlockNumber(blockB), this.getBlockNumber(blockC), ref scoreChange, ref newNumbers, ref shiftBy, ref blockCollision);
355
356 blockA.GetComponent
357 blockB.GetComponent
358 blockC.GetComponent
359
360 numMoves = numMoves + shiftBy["a"] + shiftBy["b"] + shiftBy["c"];
361 if (blockCollision) blockCollisionSound = true;
362
363 int newHighestBlock = 0;
364 if(newNumbers["a"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["a"];
365 if(newNumbers["b"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["b"];
366 if(newNumbers["c"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["c"];
367
368 if (newHighestBlock > 0) {
369 PlayerPrefs.SetInt ("game_highest_block", newHighestBlock);
370 if (newHighestBlock == 2048) PlayerPrefs.SetString("game_status","game_won");
371 PlayerPrefs.Save ();
372 this.timer.SetNextBlockTarget(newHighestBlock);
373 if (newHighestBlock > this.getHighestBlock()) this.SetHighestBlock(newHighestBlock);
374 }
375
376
377
378
379 PlayerPrefs.Save ();
380
381 //save the numbers after the move for redo
382 numbersAfterMove[blockA.GetComponent
383 blockA.GetComponent
384 blockA.GetComponent
385
386 numbersAfterMove[blockB.GetComponent
387 blockB.GetComponent
388 blockB.GetComponent
389
390 numbersAfterMove[blockC.GetComponent
391 blockC.GetComponent
392 blockC.GetComponent
393 }
394 }
395
396 if(blockCollisionSound && this.options.play_sounds) {
397 this.collideAudioSource.PlayDelayed(this.moveDuration);
398 }
399
400 if (numMoves > 0) {
401 this.moveStartTime = Time.time;
402 this.setScore (this.score + scoreChange);
403 if(this.options.play_sounds) {
404 if (axis == "x") this.swipeAudioSource.PlayOneShot(swipeSoundX);
405 if (axis == "y") this.swipeAudioSource.PlayOneShot(swipeSoundY);
406 if (axis == "z") this.swipeAudioSource.PlayOneShot(swipeSoundZ);
407 }
408 return true;
409 }
410 else {
411 return false;
412 }
413 }
414
415 //Determine the possible successful combines between 3 blockNumbers (a,b,c) being pushed toward c
416 void calculateRowChanges (int a, int b, int c, ref int scoreChange, ref IDictionary
417 blockCollision = false;
418
419 //first check if we have any -2 values which signify that blocks cant merge along this connector
420 if(a == -2 || b == -2 || c == -2) {
421 newNumbers["a"] = a;
422 newNumbers["b"] = b;
423 newNumbers["c"] = c;
424 shiftBy["a"] = 0;
425 shiftBy["b"] = 0;
426 shiftBy["c"] = 0;
427 }
428 else {
429 //figure out if any of the three merges occurred
430 shiftBy ["c"] = 0;
431 if (c > -1 && c == b) { //b and c merged
432 scoreChange = scoreChange + c*2;
433 blockCollision = true;
434 newNumbers["c"] = c*2;
435 newNumbers["b"] = a;
436 newNumbers["a"] = -1;
437 shiftBy["b"] = 1;
438 if(a > -1) {
439 shiftBy["a"] = 1;
440 }
441 else if (a == -1) {
442 shiftBy["a"] = 0;
443 }
444 }
445 else if (b > -1 && a == b) { //a and b merged
446 scoreChange = scoreChange + a*2;
447 blockCollision = true;
448 if(c == -1) {
449 newNumbers["c"] = b*2;
450 newNumbers["b"] = -1;
451 newNumbers["a"] = -1;
452 shiftBy["b"] = 1;
453 shiftBy["a"] = 2;
454 }
455 else {
456 newNumbers["c"] = c;
457 newNumbers["b"] = b*2;
458 newNumbers["a"] = -1;
459 shiftBy["b"] = 0;
460 shiftBy["a"] = 1;
461 }
462 }
463 else if (c > -1 && a == c && b == -1) { //a and c merged
464 scoreChange = scoreChange + c*2;
465 blockCollision = true;
466 newNumbers["c"] = c*2;
467 newNumbers["b"] = -1;
468 newNumbers["a"] = -1;
469 shiftBy["b"] = 0;
470 shiftBy["a"] = 2;
471 } //end of merges block
472 else { //no merges occurred
473 if(c > -1) { //last column has number
474 newNumbers["c"] = c;
475 if(b > -1) { //second column has number
476 newNumbers["b"] = b;
477 newNumbers["a"] = a;
478 shiftBy["b"] = 0;
479 shiftBy["a"] = 0;
480 }
481 else if(b == -1) {//second column empty
482 newNumbers["b"] = a;
483 newNumbers["a"] = -1;
484 shiftBy["b"] = 0;
485 if (a == -1) {
486 shiftBy["a"] = 0;
487 }
488 else {
489 shiftBy["a"] = 1;
490 }
491 }
492
493 } //end of block for value in c column
494 else if (c == -1) { //first column empty
495 if(b > -1) { //second column has number
496 newNumbers["c"] = b;
497 newNumbers["b"] = a;
498 newNumbers["a"] = -1;
499 shiftBy["b"] = 1;
500 if(a > -1) {
501 shiftBy["a"] = 1;
502 }
503 else {
504 shiftBy["a"] = 0;
505 }
506
507 }
508 else if(b == -1) { //second column empty and first column empty
509 newNumbers["c"] = a;
510 newNumbers["b"] = -1;
511 newNumbers["a"] = -1;
512 shiftBy["b"] = 0;
513 if (a == -1) {
514 shiftBy["a"] = 0;
515 }
516 else {
517 shiftBy["a"] = 2;
518 }
519 }
520 }
521 } //end of no merges block
522 } //end of check for -2;
523 }
524
525
526 void Update (){
527 int x =0, y=0, z=0, newNumber=0;
528 if(GameControllerScript.performRestart) {
529 this.restart ();
530 GameControllerScript.performRestart = false;
531 }
532 if(moveStartTime >= 0) {
533 if(Time.time - this.moveStartTime > this.moveDuration + 0.05F) {
534 this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
535 this.saveHistory ();
536 this.moveStartTime = -1F;
537 if(this.getEmptyBlocks().Count == 0) {
538 if(this.CheckGameOver()) {
539 PlayerPrefs.SetString ("game_status", "game_over");
540 PlayerPrefs.Save();
541 }
542 }
543 }
544 }
545 else {
546 bool moved;
547 if (Input.GetKeyUp("right")) moved = this.doMove ("x", 1);
548 if (Input.GetKeyUp("left")) moved = this.doMove ("x", -1);
549 if (Input.GetKeyUp("up")) moved = this.doMove ("y", 1);
550 if (Input.GetKeyUp("down")) moved = this.doMove ("y", -1);
551 if (Input.GetKeyUp("a")) moved = this.doMove ("z", 1);
552 if (Input.GetKeyUp("z")) moved = this.doMove ("z", -1);
553 }
554 this.adjustConnectors();
555 if (Input.GetKey(KeyCode.Escape))
556 {
557 Application.Quit();
558 }
559 }
560
561 void FixedUpdate () {
562 }
563
564 void setScore(int score) {
565 this.score = score;
566 PlayerPrefs.SetInt ("score", score);
567
568 //handle setting high score
569 if(this.score > this.GetHighScore()) {
570 this.SetHighScore(this.score);
571 }
572 }
573
574 public void restart() {
575 int[,,] positions = new int[3, 3, 3];
576 int x=0, y=0, z=0, newNumber=0;
577 this.gameLight.intensity = this.lightIntensity;
578
579 for (x = 0; x <= 2; x++) {
580 for (y = 0; y <= 2; y++) {
581 for (z = 0; z <= 2; z++) {
582 this.setBlockNumber(this.blocks[x,y,z], this.getInitialBlockNumber(x,y,z));
583 positions[x,y,z] = -1;
584 }
585 }
586 }
587
588 this.adjustConnectors ();
589
590 PlayerPrefs.SetString ("redo_moves2","");
591 PlayerPrefs.SetString ("redo_moves1","");
592 PlayerPrefs.SetString ("redo_moves0","");
593 PlayerPrefs.SetInt ("redos", 2);
594 PlayerPrefs.SetString ("game_status", "playing");
595 PlayerPrefs.SetInt ("game_highest_block", 0);
596 PlayerPrefs.SetInt ("cube_rotation_x", 0);
597 PlayerPrefs.SetInt ("cube_rotation_y", 0);
598 PlayerPrefs.SetInt ("cube_rotation_z", 0);
599 PlayerPrefs.Save ();
600
601 this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
602 positions [x, y, z] = newNumber;
603 this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
604 positions [x, y, z] = newNumber;
605 this.saveHistory();
606
607 this.setScore (0);
608
609 TimerScript timerScript = this.gameObject.GetComponent ("TimerScript") as TimerScript;
610 timerScript.ResetTimer();
611 }
612
613 public int GetHighScore()
614 {
615 string key = "highscore-" + options.GetOptionsKey();
616 if (PlayerPrefs.HasKey (key)) {
617 return PlayerPrefs.GetInt (key);
618 }
619 else {
620 this.SetHighScore(0);
621 return 0;
622 }
623 }
624
625 void SetHighScore(int myHighScore)
626 {
627 string key = "highscore-" + options.GetOptionsKey();
628 PlayerPrefs.SetInt( key, myHighScore );
629 PlayerPrefs.Save();
630 }
631
632 public int getHighestBlock()
633 {
634 string key = "highestblock-" + options.GetOptionsKey();
635 if (PlayerPrefs.HasKey (key)) {
636 return PlayerPrefs.GetInt (key);
637 }
638 else {
639 this.SetHighestBlock(0);
640 return 0;
641 }
642 }
643
644 void SetHighestBlock(int highestBlock)
645 {
646 string key = "highestblock-" + options.GetOptionsKey();
647 PlayerPrefs.SetInt( key, highestBlock );
648 PlayerPrefs.Save();
649 }
650
651 private bool CheckGameOver() {
652
653 string[] axisList = new string[3] {"x", "y", "z"};
654 int direction = 1;
655 string axis = "x";
656 int loop1, loop2, loopAxis; //looping variables
657 int x, y, z; //block location variables
658 int numMoves = 0; //number of moves to make
659 int scoreChange = 0;
660 bool blockCollision = false;
661 Transform blockA, blockB, blockC; //variables for holding the three blocks in a row
662 IDictionary
663 IDictionary
664
665 //loop through each of the 9 rows to be calculated
666 for(loopAxis = 0; loopAxis < 3; loopAxis ++) {
667 axis = axisList[loopAxis];
668 for(direction = -1; direction < 2; direction += 2) {
669 for(loop1 = 0; loop1 <=2; loop1++) {
670 for(loop2 = 0; loop2 <=2; loop2++) {
671 if (axis == "x") {
672 y = loop1;
673 z = loop2;
674 if (direction == 1) {
675 blockA= this.blocks[0,y,z];
676 blockB= this.blocks[1,y,z];
677 blockC= this.blocks[2,y,z];
678 }
679 else {
680 blockA= this.blocks[2,y,z];
681 blockB= this.blocks[1,y,z];
682 blockC= this.blocks[0,y,z];
683 }
684 }
685 else if (axis == "y") {
686 x = loop1;
687 z = loop2;
688 if (direction == 1) {
689 blockA= this.blocks[x,0,z];
690 blockB= this.blocks[x,1,z];
691 blockC= this.blocks[x,2,z];
692 }
693 else {
694 blockA= this.blocks[x,2,z];
695 blockB= this.blocks[x,1,z];
696 blockC= this.blocks[x,0,z];
697 }
698 }
699 else {
700 x = loop1;
701 y = loop2;
702 if (direction == 1) {
703 blockA= this.blocks[x,y,0];
704 blockB= this.blocks[x,y,1];
705 blockC= this.blocks[x,y,2];
706 }
707 else {
708 blockA= this.blocks[x,y,2];
709 blockB= this.blocks[x,y,1];
710 blockC= this.blocks[x,y,0];
711 }
712 }
713 calculateRowChanges(this.getBlockNumber(blockA), this.getBlockNumber(blockB), this.getBlockNumber(blockC), ref scoreChange, ref newNumbers, ref shiftBy, ref blockCollision);
714
715 numMoves = numMoves + shiftBy["a"] + shiftBy["b"] + shiftBy["c"];
716 }
717 }
718 }
719 }
720 if (numMoves > 0) {
721 return false;
722 }
723 else {
724 return true;
725 }
726 }
727
728 void OnGUI() {
729 //GAME GUI
730 if (this.gameView == "game") {
731 GUI.skin = currentGUISkin;
732 this.gameLight.intensity = this.lightIntensity;
733 this.mainCamera.transform.eulerAngles = new Vector3 (16F, 29.5F, 0);
734
735 //create rotating buttons
736
737
738
739 if (PlayerPrefs.GetString ("game_status") == "game_over") {
740 GUI.Label (new Rect (0, Screen.height * 0.3f , Screen.width, Screen.height * 0.10F), "Game Over", "BigLabel");
741 this.gameLight.intensity = 0;
742 }
743 if (PlayerPrefs.GetString ("game_status") == "game_won") {
744 GUI.Label (new Rect (0, Screen.height * 0.3f , Screen.width, Screen.height * 0.10F), "You Won!", "BigLabel");
745 if (GUI.Button(new Rect(Screen.width * .33f, Screen.height * 0.4F, Screen.width * 0.30F, Screen.height * 0.06F),"Continue")) {
746 PlayerPrefs.SetString ("game_status", "playing");
747 PlayerPrefs.Save ();
748 }
749 this.gameLight.intensity = 0;
750 }
751
752 GUI.Label (new Rect (0, 0, Screen.width, Screen.height * 0.06F), "Score: " + this.score.ToString (), "BigLabel");
753 string highScoreText = "High Score/Block: " + this.GetHighScore ().ToString () + " / " + this.getHighestBlock ().ToString ();
754 GUI.Label (new Rect (0, Screen.height * 0.06F, Screen.width, Screen.height / 10), highScoreText, "SmallLabel");
755
756
757 GUIStyle style = currentGUISkin.GetStyle ("button");
758 //style.fontSize = 14;
759
760 if (GUI.Button(new Rect(1, Screen.height * 0.12F, Screen.width * 0.30F, Screen.height * 0.06F),"Menu")) {
761 this.gameView = "menu";
762 }
763 if (GUI.Button(new Rect(Screen.width * .33f, Screen.height * 0.12F, Screen.width * 0.33F, Screen.height * 0.06F),"Restart")) {
764 this.restart();
765 }
766 if (GUI.Button(new Rect(Screen.width * .7f, Screen.height * 0.12F, Screen.width * .3f, Screen.height * 0.06F), "Undo (" + PlayerPrefs.GetInt ("redos").ToString () + ")")) {
767 this.undo();
768 }
769
770
771 //Roation buttons
772
773
774 //GUI.Label(new Rect(Screen.width * .8f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButton");
775
776 //left button
777 if (GUI.Button(new Rect(Screen.width * .73f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "\t", "RotateButtonLeft")) {
778 this.rotateBlocks(Vector3.up);
779 }
780 //right button
781 if (GUI.Button(new Rect(Screen.width * .87f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonRight")) {
782 this.rotateBlocks(Vector3.down);
783 }
784 //up button
785 if (GUI.Button(new Rect(Screen.width * .8f, Screen.height * 0.675F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonUp")) {
786 this.rotateBlocks(Vector3.right);
787 }
788 //down button
789 if (GUI.Button(new Rect(Screen.width * .8f, Screen.height * 0.765F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonDown")) {
790 this.rotateBlocks(Vector3.left);
791 }
792 }
793 }
794
795 private void sizeGUI() {
796 this.currentGUISkin.GetStyle ("Label").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
797 this.currentGUISkin.GetStyle ("Button").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
798 this.currentGUISkin.GetStyle ("Subheader").fontSize = Mathf.CeilToInt(Screen.height * 0.05F);
799 this.currentGUISkin.GetStyle ("Toggle").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
800 this.currentGUISkin.GetStyle ("ToggleLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
801 this.currentGUISkin.GetStyle ("ToggleLabelWarning").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
802
803 this.currentGUISkin.GetStyle ("SmallLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.03F);
804
805 this.currentGUISkin.GetStyle ("BigLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.06F);
806
807 this.currentGUISkin.GetStyle ("Toggle").padding.top = Mathf.CeilToInt(Screen.height * 0.04F);
808 this.currentGUISkin.GetStyle ("Toggle").padding.left = Mathf.CeilToInt(Screen.height * 0.04F);
809 }
810
811 private void saveHistory() {
812 int x,y,z;
813 string stringVal = "";
814
815 //create comma separated list of values
816 for (x = 0; x <= 2; x++) {
817 for (y = 0; y <= 2; y++) {
818 for (z = 0; z <= 2; z++) {
819 stringVal = stringVal + getBlockNumber(this.blocks[x,y,z]).ToString() + ",";
820 }
821 }
822 }
823 //add score and highest block to end of array
824 stringVal = stringVal + this.score.ToString() + "," + PlayerPrefs.GetInt ("game_highest_block").ToString();
825
826 PlayerPrefs.SetString ("redo_moves2",PlayerPrefs.GetString ("redo_moves1"));
827 PlayerPrefs.SetString ("redo_moves1",PlayerPrefs.GetString ("redo_moves0"));
828 PlayerPrefs.SetString ("redo_moves0",stringVal);
829
830 PlayerPrefs.Save();
831 }
832
833 private void undo() {
834 string[] positions = new string[27];
835 int myNum = 0;
836 char[] separator = {','};
837
838 if( PlayerPrefs.GetString ("game_status") != "game_over"
839 && PlayerPrefs.GetString ("redo_moves1") != ""
840 && PlayerPrefs.GetInt ("redos") > 0
841 ) {
842 positions = PlayerPrefs.GetString ("redo_moves1").Split (separator);
843 //loop through and set the block numbers for each block
844 for (int x = 0; x <= 2; x++) {
845 for (int y = 0; y <= 2; y++) {
846 for (int z = 0; z <= 2; z++) {
847 int.TryParse(positions[9*x+3*y+z], out myNum);
848 this.setBlockNumber(this.blocks[x,y,z],myNum);
849 }
850 }
851 }
852
853 //roll back the score
854 int.TryParse (positions[27], out myNum);
855 this.setScore (myNum);
856
857 //roll back the game_highest_block
858 int.TryParse (positions[28], out myNum);
859 PlayerPrefs.SetInt ("game_highest_block", myNum);
860
861 //move all the redo moves back
862 PlayerPrefs.SetString ("redo_moves0",PlayerPrefs.GetString ("redo_moves1"));
863 PlayerPrefs.SetString ("redo_moves1",PlayerPrefs.GetString ("redo_moves2"));
864 PlayerPrefs.SetString ("redo_moves2","");
865 PlayerPrefs.SetInt ("redos", PlayerPrefs.GetInt ("redos") - 1);
866 }
867 }
868
869 private void rotateBlocks(Vector3 direction) {
870 Transform block;
871 BlockScript blockScript;
872 Transform connector;
873 ConnectorScript connectorScript;
874 this.rotating = true;
875 for (int x = 0; x <= 2; x++) {
876 for (int y = 0; y <= 2; y++) {
877 for (int z = 0; z <= 2; z++) {
878 block = this.blocks[x,y,z];
879 block.GetComponent
880
881 for(int axis = 0; axis <=2; axis++) {
882 connector = this.connectors[x,y,z,axis];
883 connector.GetComponent
884 }
885 }
886 }
887 }
888 }
889
890 private void loadSavedGame() {
891 string[] positions = new string[27];
892 int positionNum = 0;
893 char[] separator = {','};
894 positions = PlayerPrefs.GetString ("redo_moves0").Split (separator);
895
896 for (int x = 0; x <= 2; x++) {
897 for (int y = 0; y <= 2; y++) {
898 for (int z = 0; z <= 2; z++) {
899 int.TryParse(positions[9*x+3*y+z], out positionNum);
900 this.setBlockNumber(this.blocks[x,y,z],positionNum);
901 }
902 }
903 }
904
905
906 this.adjustConnectors ();
907 this.setScore (PlayerPrefs.GetInt ("score"));
908
909 }
910}
911
912
File name: InstructionsScript.cs
Copy
27 void OnGUI() {
28 if (this.gameScript.gameView == "instructions") {
29 GUI.skin = currentGUISkin;
30
31 this.gameScript.mainCamera.transform.eulerAngles = new Vector3 (120, 23, 0);
32
33 GUIStyle labelStyle = new GUIStyle(currentGUISkin.label);
34 labelStyle.alignment = TextAnchor.UpperLeft;
35 GUILayout.Label ("Instructions", "BigLabel");
36
37
38 scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Width(Screen.width), GUILayout.Height(Mathf.Ceil(Screen.height * .80f)));
39
40 GUILayout.Label ("Object", "Subheader");
41
42 GUILayout.Label (@"The object of 2048-3D is to"
43 + " slide numbered blocks in such a way"
44 + " so that blocks with the same numbers collide"
45 + " and combine into a new block that is twice"
46 + " as much as the originals until"
47 + " the number 2048 is reached.", labelStyle);
48
49 GUILayout.Label ("Moving the Blocks", "Subheader");
50
51 GUILayout.Label (@"You cannot move blocks individually, but must"
52 + " move all blocks simultaneously in the same direction."
53 + " Blocks can move forward, backward, up, down, left"
54 + " and right along the green connectors."
55 + " Simply swipe any part of the screen to move up,"
56 + " down, left or right (keyboard: arrow keys). To move the"
57 + " blocks forward and backward use the"
58 + " big red arrow keys at the bottom of the screen (keyboard: a and z keys)."
59 + " When moving, all blocks that can slide in the chosen direction will move."
60 + " Any block moving toward another block with the same number will collide "
61 + " and form a single block with twice the number as the originals", labelStyle);
62
63
64 GUILayout.Label ("New Blocks", "Subheader");
65
66 GUILayout.Label (@"After each move is"
67 + " made a new block will appear randomly in an empty position."
68 + " This block will have a number of either 2 or 4."
69 + " For an extra challenge, there is a game option you can"
70 + " set so that zeros can also be assinged to a new block."
71 + " Zeros act like any other number in that they can"
72 + " collide with other zeros to make a block twice as much "
73 + " (which is still zero).", labelStyle);
74
75
76
77 GUILayout.Label ("Scoring and Finishing", "Subheader");
78
79 GUILayout.Label(@"For every block collision that occurs you receive"
80 + " the number of points of the newly"
81 + " created block. If after making a move"
82 + " all positions are filled and no new"
83 + " moves are possible, the game ends."
84 + " A separate high score / highest block is kept for each"
85 + " distinct combination of game options", labelStyle);
86
87
88 GUILayout.Label ("Game Layout Options", "Subheader");
89
90 GUILayout.Label (@"When I first made this game there"
91 + " was only one game layout, a 3x3x3 cube."
92 + " After testing it a bit, it was way to easy"
93 + " so the zero option was added."
94 + " It was still way to easy "
95 + " (e.g. you could swipe without even looking and get pretty far)."
96 + " Therefore there are now several diffent game layouts that"
97 + " make the game more challenging and fun.", labelStyle);
98
99 GUILayout.Label ("Game Timer Option", "Subheader");
100
101 GUILayout.Label (@"To give yourself even more of a challenge"
102 + " you can set game options to include a timer."
103 + " If a timer is chosen you have a specific"
104 + " amount of time to combined blocks to make the 64 block."
105 + " If you run out of time the game is over."
106 + " If you reach your target before the timer runs down you will"
107 + " receive additional time to reach the next target."
108 + " The time you received is as follows: \n"
109 + " 64: option time + 5 seconds (because the first one is the hardest!)\n"
110 + " 128: option time\n"
111 + " 256: 2X option time\n"
112 + " 512: 4X option time \n"
113 + " 1024: 8X option time \n"
114 + " you get the idea.", labelStyle);
115
116
117 GUILayout.Label ("Acknowledgements \nand Confessions", "Subheader");
118
119 GUILayout.Label (@"2048-3D is based upon the original" +
120 " 2048 game designed by Gabriele Cirulli " +
121 " \n\n" +
122 " Sound effects by freeSFX http://www.freesfx.co.uk.\n\n" +
123 " This game was designed using the Unity3D game engine.\n\n" +
124 " FOR MORE PROJECTS VISIT:" +
125 " https://code-projects.org/", labelStyle);
126
127
128 foreach (Touch touch in Input.touches) {
129 if (touch.phase == TouchPhase.Moved)
130 {
131 // dragging
132 this.scrollPosition.y += touch.deltaPosition.y;
133 }
134 }
135 GUILayout.EndScrollView();
136
137 if (GUILayout.Button ("Return to Menu")) {
138 this.gameScript.gameView = "menu";
139 }
140 }
141 }
File name: Form1.cs
Copy
282 public void FRST_Click(System.Object sender, System.EventArgs e)
283 {
284 dsgrade = gradeclass.DataModule.navigate();
285 if (inc != 0)
286 {
287 inc = 0;
288 NavRecords();
289 MessageBox.Show("First Record");
290 }
291 }
First 184 lượt xem
Gõ tìm kiếm nhanh...