请选择 进入手机版 | 继续访问电脑版
搜索
查看: 208|回复: 0

制作ufo大作战中篇

[复制链接]

9

主题

63

帖子

470

积分

超级版主

Rank: 8Rank: 8

积分
470
发表于 2017-2-7 16:26:36 | 显示全部楼层 |阅读模式
制作流程1.制作游戏对象1.1 准备好素材 QQ图片20170206205339.png

1.2 制作sprite
QQ图片20170206205633.png


Sprite Mode是根据图片是单还是多张选择;
QQ图片20170206210306.png



Pixels Per Unit表示多少像素每单元;调整这个数值,使我们的物体体积与服务器的判断体积一致。

1.3 制作2D动画

以其中的爆炸效果为例

在Windows菜单栏下的Animation下,创建destroy动画。

QQ图片20170206210748.png

1.4 创建爆炸粒子效果

如果你觉得2D动画效果不好,可以用粒子效果.

先创建一个游戏对象,然后选择GameObject下的Particle System

QQ图片20170206211336.png


调整好粒子释放时间,范围,密度,颜色。

1.5 编写对应的游戏对象脚本
  1. 由于大部分碰撞与移动的逻辑已经由服务器处理了。我们的游戏对象只要编写销毁时的逻辑就可以了。
  2. 如食物
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. public class FoodObject : MonoBehaviour {
  7.     private static Object FoodBoom = null;
  8.     public void destroy()
  9.     {
  10.         //GetComponent<Animator>().SetTrigger("dead");
  11.         if (FoodBoom == null)
  12.         {
  13.             FoodBoom = Resources.Load("FoodBoom");
  14.         }
  15.         Object obj = Instantiate(FoodBoom, new Vector2(transform.localPosition.x + 8.5f, transform.localPosition.y + 8.5f), Quaternion.identity);
  16.         Destroy(obj,1.0f);
  17.         Destroy(gameObject);
  18.     }
  19. }
  20. 如玩家
  21. using System.Collections;
  22. using System.Collections.Generic;
  23. using UnityEngine;
  24. public class PlayerObject : MonoBehaviour
  25. {
  26.     private static Object PlayerBoom = null;
  27.     public void dead()
  28.     {
  29.         if (PlayerBoom == null)
  30.         {
  31.             PlayerBoom = Resources.Load("PlayerBoom");
  32.         }
  33.         Instantiate(PlayerBoom, new Vector2(transform.localPosition.x + 16.0f, transform.localPosition.y + 16.0f), Quaternion.identity);
  34.     }
  35.     public void destroy()
  36.     {
  37.         //GetComponent<Animator>().SetTrigger("dead");
  38.         if (PlayerBoom == null)
  39.         {
  40.             PlayerBoom = Resources.Load("PlayerBoom");
  41.         }
  42.         Instantiate(PlayerBoom, new Vector2(transform.localPosition.x + 16.0f, transform.localPosition.y + 16.0f), Quaternion.identity);
  43.         Destroy(gameObject);
  44.     }
  45. }
复制代码
1.6 创建预设体

由于我们会大量的生成与释放游戏对象,所以,把游戏对象做成预设体。

2 输入控制2.1 键盘输入控制

在电脑上,最为方便的方式是键盘输入了

有三个函数:

bool Input.GetKey(KeyCode)

bool Input.GetKeyDown(KeyCode)

bool Input.GetKeyUp(KeyCode)

KeyCode代表按键

GetKey表示长按,GetKeyDown表示按下,GetKeyUp表示弹起。当触发对应的按键事件,返回true,否者为false。

  1. if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
  2. {
  3.     direction.left = 1;
  4. }
  5. if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
  6. {
  7.     direction.right = 1;
  8. }
  9. if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
  10. {
  11.     direction.up = 1;
  12. }
  13. if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
  14. {
  15.     direction.down = 1;
  16. }
复制代码

2.2 鼠标输入控制

和键盘一样

Input.GetMouseButton(Key)

Input.GetMouseButtonDown(Key)

Input.GetMouseButtonUp(Key)

Key代表按键,0鼠标左键,1鼠标右键

GetMouseButton表示长按,GetMouseButtonDown表示按下,GetMouseButtonUp表示弹起。当触发对应的按键事件,返回true,否者为false。

鼠标事件还能移植到手机还能发挥作用,但是手机的触碰事件可以多点触碰。

2.3 简单的虚拟摇杆逻辑

当我们按下鼠标,纪录鼠标起始位置。当我们长按鼠标,纪录鼠标当前位置。通过两点,通过三角函数运算得出方向。

  1. void Update()
  2. {
  3. if (Input.GetMouseButtonDown(0))
  4. {
  5.   start = Input.mousePosition;
  6.   }
  7. if (Input.GetMouseButton(0))
  8. {
  9. Vector3 now = Input.mousePosition;
  10. float tempH = (now.x - start.x);
  11. float tempV = (now.y - start.y);
  12. float angle;
  13. if (tempH >= -float.Epsilon && tempH <= float.Epsilon)
  14. {
  15. if (tempV > 0.0f)
  16. {
  17. direction.up = 1;
  18. }
  19. if (tempV < 0.0f)
  20. {
  21. direction.down = 1;
  22. }
  23. }
  24. else
  25. {
  26. angle = Mathf.Atan(tempV / tempH) / pi * 180;
  27. if (angle >= -60.0f && angle <= 60.0f)
  28. {
  29. if (tempH < 0.0f)
  30. {
  31. direction.left = 1;
  32. }
  33. if (tempH > 0.0f)
  34. {
  35. direction.right = 1;
  36. }
  37. }
  38. if (angle >= 30.0f || angle <= -30.0f)
  39. {
  40. if (tempV > 0.0f)
  41. {
  42. direction.up = 1;
  43. }
  44. if (tempV < 0.0f)
  45. {
  46. direction.down = 1;
  47. }
  48. }
  49. }
  50. move(direction);
  51. }
复制代码

3 摄像头3.1 摄像头跟随
  1. using System;
  2. using UnityEngine;
  3. public class CameraScript : MonoBehaviour
  4. {
  5.     private Vector3 velocity;
  6.     void Update ()
  7.     {
  8.         if (PlayersController._myself != null)
  9.         {
  10.             transform.localPosition = Vector3.SmoothDamp(transform.localPosition, new Vector3(PlayersController._myself.x + 0.5f * PlayersController._myself.level + 16.0f,                PlayersController._myself.y + 0.5f * PlayersController._myself.level + 16.0f, -2.0f), ref velocity, 0.8f);
  11.             GetComponent<Camera>().orthographicSize = 256 + 0.5f * PlayersController._myself.level;
  12.         }
  13.          
  14.     }
  15. }
复制代码

利用平滑移动函数,让摄像头平滑跟随我们玩家自己。

3.2 摄像头设置
QQ图片20170206214758.png

size参数表示我们现实的高度的一半为多少单位。

4 排行榜4.1 通过GUI实现排行榜显示
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System;
  5. public class TopListController : MonoBehaviour {
  6.     private static List<Player> _topList = null;
  7.     public delegate void PullTopList();
  8.     public static PullTopList pullTopList = JsonHandler.pullTopList;
  9.     private DateTime lastTime = new DateTime();
  10.     private Vector2 _size = new Vector2(200,200);
  11.     public static void onPullTopList(List<Player> topList)
  12.     {
  13.         if (topList != null)
  14.         {
  15.             _topList = topList;
  16.         }
  17.     }
  18.     void Update()
  19.     {
  20.         if (PlayersController._myself != null)
  21.         {
  22.             transform.localPosition = new Vector3(PlayersController._myself.x, PlayersController._myself.y, -1.0f);
  23.         }
  24.         if (DateTime.Now.Subtract(lastTime).Seconds >= 10)
  25.         {
  26.             pullTopList();
  27.             lastTime = DateTime.Now;
  28.         }
  29.     }
  30.     void OnGUI()
  31.     {
  32.         GUI.skin.label.normal.textColor = new Color(1, 0, 0, 1);
  33.         GUI.Label(new Rect(768, 384, 128, 20), "分数排行:");
  34.         float y = 384.0f;
  35.         if (_topList != null)
  36.         {
  37.             foreach (Player player in _topList)
  38.             {
  39.                 y += 20.0f;
  40.                 GUI.Label(new Rect(768, y, 128, 20), "player" + player.id.ToString() + ":" + player.level.ToString());
  41.             }
  42.         }
  43.     }
  44. }
复制代码

首先,排行榜应该和摄像头一样,跟随摄像头移动。

玩家名字的现实,可以使用GUI.Label来实现.GUI.开头的函数必须写在OnGUI函数中。

5 对游戏对象控制5.1 对玩家游戏对象控制脚本
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. public class PlayersController : MonoBehaviour {
  4.     static Vector3 velocity;
  5.     public static List<Player> _players = new List<Player>();
  6.     public static Player _myself = null;
  7.     public static Object _playerObject = null;
  8.     public static List<GameObject> _playerObjects = new List<GameObject>();
  9.     public delegate void PullPlayers();
  10.     public static PullPlayers pullPlayers = JsonHandler.pullPlayers;
  11.     public delegate void Join();
  12.     public static Join join = JsonHandler.join;
  13.     public delegate void Leave();
  14.     public static Leave leave = JsonHandler.leave;
  15.     public static void onPullPlayers(List<Player> players)
  16.     {
  17.         Loom.QueueOnMainThread(() =>
  18.         {
  19.             if (_playerObject == null)
  20.             {
  21.                 _playerObject = Resources.Load("Player");
  22.             }
  23.             foreach (Player player in players)
  24.             {
  25.                 if (_myself != null)
  26.                 {
  27.                     if (_myself.id == player.id)
  28.                     {
  29.                         continue;
  30.                     }
  31.                 }
  32.                 GameObject playerObject = (GameObject)Instantiate(_playerObject, new Vector2(player.x, player.y), Quaternion.identity);
  33.                 playerObject.name = "player" + player.id;
  34.                 playerObject.transform.localScale = player.appropriateScale();
  35.                 _players.Add(player);
  36.                 _playerObjects.Add(playerObject);
  37.             }
  38.         });
  39.     }
  40.     public static void onUserJoin(Player player)
  41.     {
  42.         if (_myself == null)
  43.         {
  44.             _myself = player;
  45.         }
  46.         Loom.QueueOnMainThread(() =>
  47.         {
  48.             if(_playerObject == null)
  49.             {
  50.                 _playerObject = Resources.Load("Player");
  51.             }
  52.             GameObject playerObject = (GameObject)Instantiate(_playerObject, new Vector2(player.x, player.y), Quaternion.identity);
  53.             playerObject.name = "player" + player.id;
  54.             playerObject.transform.localScale = player.appropriateScale();
  55.             _players.Add(player);
  56.             _playerObjects.Add(playerObject);
  57.         });
  58.     }
  59.     public static void onUserLeave(Player player)
  60.     {
  61.         Player findPlayer = _players.Find((Player tempPlayer) => { return tempPlayer.id == player.id; });
  62.         if (findPlayer != null)
  63.         {
  64.             GameObject findPlayerObject = _playerObjects.Find((GameObject tempPlayerObject) => { return tempPlayerObject.name == "player" + player.id; });
  65.             if (findPlayerObject != null)
  66.             {
  67.                 _players.Remove(findPlayer);
  68.                 findPlayerObject.GetComponent<PlayerObject>().destroy();
  69.                 _playerObjects.Remove(findPlayerObject);
  70.                 Debug.Log("remove this player and this playerObject.");
  71.             }
  72.             /*
  73.             else
  74.             {
  75.                 Debug.Log("this player exist but this playerObject not exist.");
  76.                 _players.Remove(findPlayer);
  77.             }
  78.             */
  79.         }
  80.         /*
  81.         else
  82.         {
  83.             Debug.Log("this player not exist.");
  84.         }
  85.         */
  86.     }
  87.     public static void onPlayerMove(Player player)
  88.     {
  89.         Player findPlayer = _players.Find((Player tempPlayer) => { return tempPlayer.id == player.id; });
  90.         if (findPlayer != null)
  91.         {
  92.             GameObject findPlayerObject = _playerObjects.Find((GameObject tempPlayerObject) =>
  93.             {
  94.                 return tempPlayerObject.name == "player" + player.id;
  95.             });
  96.             if (findPlayerObject != null)
  97.             {
  98.                 if (player.state == 1)
  99.                 {
  100.                     findPlayerObject.GetComponent<PlayerObject>().dead();
  101.                 }
  102.                 findPlayer.x = player.x;
  103.                 findPlayer.y = player.y;
  104.                 findPlayer.level = player.level;
  105.                 findPlayerObject.transform.localPosition = new Vector2(player.x, player.y);
  106.                 findPlayerObject.transform.localScale = player.appropriateScale();
  107.                 Debug.Log("change this player and this playerObject.");
  108.             }
  109.             /*
  110.             else
  111.             {
  112.                 Debug.Log("this player exist but this playersObject not exist.");
  113.                 findPlayer.x = player.x;
  114.                 findPlayer.y = player.y;
  115.                 findPlayer.level = player.level;
  116.                 GameObject playerObject = (GameObject)Instantiate(_playerObject, Player.positionChange(player.x, player.y), Quaternion.identity);
  117.                 playerObject.name = "player" + player.id;
  118.                 playerObject.transform.localScale = Player.level2Scale(player.level);
  119.                 _playerObjects.Add(playerObject);
  120.             }
  121.             */
  122.         }
  123.         /*
  124.         else
  125.         {
  126.             GameObject playerObject = (GameObject)Instantiate(_playerObject, Player.positionChange(player.x, player.y), Quaternion.identity);
  127.             playerObject.name = "player" + player.id;
  128.             playerObject.transform.localScale = Player.level2Scale(player.level);
  129.             _players.Add(player);
  130.             _playerObjects.Add(playerObject);
  131.             Debug.Log("create this player and this playerObject.");
  132.         }
  133.         */
  134.     }
  135.     void Start()
  136.     {
  137.         join();
  138.         pullPlayers();
  139.     }
  140. }
复制代码
5.2 对食物游戏对象控制脚本
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. public class FoodsController : MonoBehaviour
  4. {
  5.     public static List<Food> _foods = new List<Food>();
  6.     public static List<GameObject> _foodObjects = new List<GameObject>();
  7.     public static Object _foodObject = null;
  8.     public delegate void PullFoods();
  9.     public static PullFoods pullFoods = JsonHandler.pullFoods;
  10.     public static void onPullFoods(List<Food> foods)
  11.     {
  12.         Loom.QueueOnMainThread(()=>
  13.         {
  14.             if (_foodObject == null)
  15.             {
  16.                 _foodObject = Resources.Load("Food");
  17.             }
  18.             foreach (Food food in foods)
  19.             {
  20.                 GameObject foodObject = (GameObject)Instantiate(_foodObject, new Vector2(food.x, food.y), Quaternion.identity);
  21.                 foodObject.name = "food" + food.id;
  22.                 foodObject.transform.localScale = food.appropriateScale();
  23.                 _foods.Add(food);
  24.                 _foodObjects.Add(foodObject);
  25.             }
  26.         });
  27.     }
  28.     public static void onFoodsChanged(Food food)
  29.     {
  30.         switch (food.state)
  31.         {
  32.             case 0:
  33.                 {
  34.                     Food findFood = _foods.Find((Food tempFood) => { return tempFood.id == food.id; });
  35.                     if (findFood != null)
  36.                     {
  37.                         GameObject findFoodObject = _foodObjects.Find((GameObject tempFoodObject) =>
  38.                         {
  39.                             return tempFoodObject.name == "food" + food.id;
  40.                         });
  41.                         if (findFoodObject != null)
  42.                         {
  43.                             findFood.x = food.x;
  44.                             findFood.y = food.y;
  45.                             findFoodObject.transform.localPosition = new Vector2(food.x, food.y);
  46.                             Debug.Log("move this food and this foodObject.");
  47.                         }
  48.                         else
  49.                         {
  50.                             Debug.Log("this food exist but this foodObject not exist.");
  51.                             findFood.x = food.x;
  52.                             findFood.y = food.y;
  53.                             GameObject foodObject = (GameObject)Instantiate(_foodObject, new Vector2(food.x, food.y), Quaternion.identity);
  54.                             foodObject.name = "food" + food.id;
  55.                             foodObject.transform.localScale = food.appropriateScale();
  56.                             _foodObjects.Add(foodObject);
  57.                         }
  58.                     }
  59.                     else
  60.                     {
  61.                         _foods.Add(food);
  62.                         GameObject foodObject = (GameObject)Instantiate(_foodObject, new Vector2(food.x, food.y), Quaternion.identity);
  63.                         foodObject.name = "food" + food.id;
  64.                         foodObject.transform.localScale = food.appropriateScale();
  65.                         _foodObjects.Add(foodObject);
  66.                         Debug.Log("create this food and this foodObject.");
  67.                     }
  68.                     break;
  69.                 }
  70.             case 1:
  71.                 {
  72.                     Food findFood = _foods.Find((Food tempFood) => { return tempFood.id == food.id; });
  73.                     if (findFood != null)
  74.                     {
  75.                         GameObject findFoodObject = _foodObjects.Find((GameObject tempFoodObject) => { return tempFoodObject.name == "food" + food.id; });
  76.                         if (findFoodObject != null)
  77.                         {
  78.                             _foods.Remove(findFood);
  79.                             findFoodObject.GetComponent<FoodObject>().destroy();
  80.                             _foodObjects.Remove(findFoodObject);
  81.                             Debug.Log("remove this food and this foodObject.");
  82.                         }
  83.                         else
  84.                         {
  85.                             Debug.Log("this food exist but this foodObject not exist.");
  86.                             _foods.Remove(findFood);
  87.                         }
  88.                     }
  89.                     else
  90.                     {
  91.                         GameObject findFoodObject = _foodObjects.Find((GameObject tempFoodObject) => { return tempFoodObject.name == "food" + food.id; });
  92.                         if (findFoodObject != null)
  93.                         {
  94.                             findFoodObject.GetComponent<FoodObject>().destroy();
  95.                             _foodObjects.Remove(findFoodObject);
  96.                             Debug.Log("remove this foodObject.");
  97.                         }
  98.                         else
  99.                         {
  100.                             Debug.Log("this food not exist.");
  101.                         }
  102.                     }
  103.                     break;
  104.                 }
  105.             default:
  106.                 Debug.Log("unknown food state.");
  107.                 break;
  108.         }
  109.     }
  110.     void Start()
  111.     {
  112.         pullFoods();
  113.     }
  114. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|MatchVS开发者论坛

GMT+8, 2017-5-29 00:31 , Processed in 0.074925 second(s), 23 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表