码迷,mamicode.com
首页 > 编程语言 > 详细

unity3d-游戏实战突出重围,整合游戏

时间:2015-02-01 23:11:15      阅读:330      评论:0      收藏:0      [点我收藏+]

标签:

结构图:

 技术分享  技术分享

 

两个场景,一个是开始界面。一个是游戏界面:

脚本说明:依次是:敌人脚本,主角游戏,主菜单,工具

Enemy

 

  1 using UnityEngine;
  2 using System.Collections;
  3 
  4 public class Enemy : MonoBehaviour
  5 {
  6 
  7     /*===============================
  8      * 敌人脚本
  9      *==============================*/
 10 
 11     //敌人状态
 12 
 13     //敌人站立状态
 14     public const int STATE_STAND = 0;
 15     //敌人行走状态
 16     public const int STATE_WALK = 1;
 17     //敌人奔跑状态
 18     public const int STATE_RUN = 2;
 19     //敌人暂停状态
 20     public const int STATE_PAUSE = 3;
 21 
 22     //记录敌人当前状态
 23     private int enemState;
 24     //主角对象
 25     private GameObject hero;
 26 
 27     //备份上一次敌人的思考时间
 28     private float backUptime;
 29     //敌人思考下一次行为时间
 30     private const int AI_ATTACK_TIME = 2;
 31     //敌人的巡逻范围
 32     public const int AI_ATTACK_DISTANCE = 10;
 33 
 34     //是否绘制血条  当鼠标指向敌人则绘制。离开则不绘制
 35     bool showBlood = false;
 36 
 37     //血条资源贴图
 38     public Texture2D tex_red;
 39     public Texture2D tex_black;
 40 
 41     //生命值贴图
 42     public Texture2D tex_hp;
 43 
 44     //生命值
 45     private int HP = 100;
 46 
 47     //敌人仇恨
 48     private bool ishatred = false;
 49 
 50     //图片数字资源
 51     Object[] texmube;
 52 
 53 
 54     // Use this for initialization
 55     void Start()
 56     {
 57         //获取主角对象,这里前端赋值比较好
 58         hero = GameObject.Find("Hero");
 59 
 60         //读取图片资源
 61         texmube = Resources.LoadAll("number");
 62 
 63         //设置敌人默认状态为站立
 64         enemState = STATE_STAND;
 65     }
 66 
 67     // Update is called once per frame
 68     void Update()
 69     {
 70         //判断敌人与主角之间的距离
 71         if (Vector3.Distance(transform.position, hero.transform.position) < AI_ATTACK_DISTANCE || ishatred)
 72         {
 73             //敌人进入奔跑状态
 74             gameObject.animation.Play("run");
 75             enemState = STATE_RUN;
 76 
 77             //设置敌人面朝主角方向
 78             transform.LookAt(hero.transform);
 79 
 80             //随机攻击主角
 81             int rand = Random.Range(0, 20);
 82             if (rand == 0)
 83             {
 84                 //模拟攻击,
 85                 //向主角发送攻击消息,然后在主角对象脚本中实现HeroHrut方法,进行主角减血
 86                 hero.SendMessage("HeroHurt");
 87             }
 88         }
 89         //敌人进入巡逻状态
 90         else
 91         {
 92             //计算敌人的思考时间
 93             if (Time.time - backUptime >= AI_ATTACK_TIME)
 94             {
 95                 //敌人开始思考
 96                 //备份思考的时间
 97                 backUptime = Time.time;
 98 
 99                 //取得0~2之间的随机数
100                 int rand = Random.Range(0, 2);
101                 if (rand == 0)
102                 {
103                     //敌人进入站立状态
104                     transform.animation.Play("idle");
105                     //设置状态
106                     enemState = STATE_STAND;
107                 }
108                 else if (rand == 1)
109                 {
110                     //敌人进入行走状态
111                     //敌人随机旋转角度
112                     Quaternion rotate = Quaternion.Euler(0, Random.Range(1, 5) * 90, 0);
113                     //1秒内完成旋转
114                     transform.rotation = Quaternion.Lerp(transform.rotation, rotate, Time.deltaTime * 1000);
115                     //播放行走动画
116                     transform.animation.Play("walk");
117                     enemState = STATE_WALK;
118                 }
119 
120             }
121         }
122         switch (enemState)
123         {
124             case STATE_STAND: break;
125             case STATE_WALK:
126                 //敌人行走
127                 transform.Translate(Vector3.forward * Time.deltaTime);
128                 //gameObject.animation.Play("walk");
129                 break;
130             case STATE_RUN:
131                 //敌人朝向主角奔跑,当相距2时,就不向前跑了
132                 if (Vector3.Distance(transform.position, hero.transform.position) > 3)
133                 {
134                     transform.Translate(Vector3.forward * Time.deltaTime * 3);
135                 }
136                 break;
137         }
138     }
139     void OnGUI()
140     {
141         if (showBlood)//如果绘制血条
142         {
143             //绘制生命值贴图
144             GUI.DrawTexture(new Rect(5, 0, tex_hp.width, tex_hp.height), tex_hp);
145             //绘制主角生命值
146             Tools.DrawImageNumber(200, 0, HP, texmube);
147 
148             //绘制敌人血条
149             int blood_width = tex_red.width * HP / 100;
150             //绘制黑色血条 即底色
151             GUI.DrawTexture(new Rect(5, 50, tex_black.width, tex_black.height), tex_black);
152             //绘制红色血条
153             GUI.DrawTexture(new Rect(5, 50, blood_width, tex_red.height), tex_red);
154         }
155     }
156 
157     /// <summary>
158     /// 当在敌人上单击鼠标左键
159     /// </summary>
160     void OnMouseDown()
161     {
162         //击中敌人目标
163         if (HP > 0)
164         {
165             //减掉5点血
166             HP -= 5;
167             //被击打时,后退
168             transform.Translate(Vector3.back * 1);
169             //击中敌人后立即进入战斗状态
170             ishatred = true;
171         }
172         else//敌人死亡
173         {
174             //敌人死亡
175             Destroy(gameObject);
176             //发送死亡消息
177             hero.SendMessage("EnemyHurt");
178         }
179     }
180     void OnMouseUp()
181     {
182         //击打后退还原
183         transform.Translate(Vector3.forward * Time.deltaTime * 1);
184     }
185     void OnMouseOver()
186     {
187         //开始绘制血条
188         showBlood = true;
189     }
190     void OnMouseExit()
191     {
192         //结束绘制血条
193         showBlood = false;
194     }
195 }

 

Game

  1 using UnityEngine;
  2 using System.Collections;
  3 
  4 public class Game : MonoBehaviour
  5 {
  6     /*===============================
  7      * 主角脚本
  8      *==============================*/
  9 
 10     //游戏状态机
 11 
 12     //游戏中状态
 13     public const int STATE_GAME = 0;
 14     //游戏胜利状态
 15     public const int STATE_WIN = 1;
 16     //游戏失败状态
 17     public const int STATE_LOSE = 2;
 18 
 19     //枚举角色鼠标位置
 20     public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
 21     public RotationAxes axes = RotationAxes.MouseXAndY;
 22     float rotationY = 0f;
 23 
 24     //鼠标准心
 25     public Texture2D tex_fire;
 26 
 27     //血条资源贴图
 28     public Texture2D tex_red;
 29     public Texture2D tex_black;
 30 
 31     //生命值贴图
 32     public Texture2D tex_hp;
 33 
 34     //战斗胜利资源贴图
 35     public Texture2D tex_win;
 36     //战斗失败资源贴图
 37     public Texture2D tex_lose;
 38     //游戏音乐资源
 39     public AudioSource music;
 40 
 41     //主角生命值
 42     public int HP = 100;
 43 
 44     //图片数字资源
 45     Object[] texmuber;
 46 
 47     //当前游戏状态
 48     int gameState;
 49 
 50 
 51 
 52     // Use this for initialization
 53     void Start()
 54     {
 55         //取消默认鼠标图标
 56         Screen.showCursor = false;
 57         //读取图片资源
 58         texmuber = Resources.LoadAll("number");
 59         //设置默认状态为游戏中
 60         gameState = STATE_GAME;
 61 
 62         if (rigidbody) //如果是刚体
 63             /*
 64              如果freezeRotation被启用,旋转不会被物体模拟修改。
 65              * 这对于创建第一人称射击游戏时是很有用的,因为玩家需要使用鼠标完全控制旋转。
 66              */
 67             rigidbody.freezeRotation = true;////冻结旋转
 68     }
 69 
 70     // Update is called once per frame
 71     void Update()
 72     {
 73         switch (gameState)
 74         {
 75             case STATE_GAME: UpdateGame(); break;
 76             case STATE_WIN:
 77             case STATE_LOSE:
 78                 if (Input.GetKey(KeyCode.Escape))
 79                 {
 80                     Application.LoadLevel("Menu");
 81                 }
 82                 break;
 83             default:
 84                 break;
 85         }
 86     }
 87 
 88 
 89     void OnGUI()
 90     {
 91         switch (gameState)
 92         {
 93             case STATE_GAME:
 94                 RenderGame();
 95                 break;
 96             case STATE_WIN:
 97                 GUI.DrawTexture(new Rect(0, 0, tex_win.width, tex_win.height), tex_win);
 98                 break;
 99             case STATE_LOSE:
100                 GUI.DrawTexture(new Rect(0, 0, tex_lose.width, tex_lose.height), tex_lose);
101                 break;
102             default:
103                 break;
104         }
105     }
106 
107     private void RenderGame()
108     {
109         if (tex_fire)
110         {
111             //绘制鼠标准心
112             float x = Input.mousePosition.x - tex_fire.width / 2;
113             float y = Screen.height - Input.mousePosition.y - tex_fire.width / 2;
114 
115             GUI.DrawTexture(new Rect(x, y, tex_fire.width, tex_fire.height), tex_fire);
116         }
117 
118         //绘制主角血条
119         int blood_width = tex_red.width * HP / 100;
120         GUI.DrawTexture(new Rect(5, Screen.height - 50, tex_black.width, tex_black.height), tex_black);
121         GUI.DrawTexture(new Rect(5, Screen.height - 50, blood_width, tex_red.height), tex_red);
122 
123         //绘制生命值贴图
124         GUI.DrawTexture(new Rect(5, Screen.height - 80, tex_hp.width, tex_hp.height), tex_hp);
125 
126         //绘制主角生命值
127         Tools.DrawImageNumber(200, Screen.height - 80, HP, texmuber);
128     }
129 
130     /// <summary>
131     /// 主角被攻击
132     /// </summary>
133     void HeroHurt()
134     {
135         HP--;
136         if (HP <= 0)
137         {
138             HP = 0;
139             gameState = STATE_LOSE; //游戏失败
140         }
141     }
142 
143     /// <summary>
144     /// 碰到道具血条加血
145     /// </summary>
146     void HeroAddBlood()
147     {
148         HP += 50;
149         if (HP >= 100)
150         {
151             HP = 100;
152         }
153     }
154     /// <summary>
155     /// 敌人被攻击
156     /// </summary>
157     void EnemyHurt()
158     {
159         //找到所有的NPC
160         GameObject[] enemy = GameObject.FindGameObjectsWithTag("enemy");
161         //Debug.Log(enemy.Length);
162 
163         //敌人对象数字长度为1表示敌人全部死亡
164         if (enemy.Length == 1)
165         {
166 
167             gameState = STATE_WIN;
168         }
169     }
170     private void UpdateGame()
171     {
172         if (Input.GetKey(KeyCode.Escape))
173         {
174             Application.LoadLevel("Menu");
175         }
176         //计算摄像机旋转
177         if (axes == RotationAxes.MouseX)
178         {
179             //旋转角色 
180             transform.Rotate(0, Input.GetAxis("Mouse X"), 0);
181         }
182         else
183         {
184             //设置角色欧拉角
185             transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
186         }
187     }
188 
189     /// <summary>
190     /// 在移动的时,当controller碰撞到collider时OnControllerColliderHit被调用。
191     /// </summary>
192     /// <param name="hit"></param>
193     void OnControllerColliderHit(ControllerColliderHit hit)
194     {
195         //获取角色控制器碰撞到的游戏对象
196         GameObject collObj = hit.gameObject;
197 
198         //是否为加血的箱子对象
199         if (collObj.name == "Cube")
200         {
201             //主角加血
202             HeroAddBlood();
203             //销毁箱子
204             Destroy(collObj);
205         }
206     }
207 
208 }

 

Menu

 

  1 using UnityEngine;
  2 using System.Collections;
  3 
  4 public class Menu : MonoBehaviour {
  5 
  6     /*===============================
  7      * 主菜单脚本
  8      *==============================*/
  9 
 10 
 11     //游戏界面状态机
 12 
 13     //主菜单界面
 14     public const int STATE_MAINMENU = 0;
 15     //游戏设置界面
 16     public const int STATE_OPTION = 1;
 17     //游戏帮助界面
 18     public const int STATE_HELP = 2;
 19     //游戏退出界面
 20     public const int STATE_EXIT = 3;
 21     //GUI皮肤
 22     public GUISkin mySkin;
 23 
 24     //游戏背景贴图
 25     public Texture textureBG;
 26     //开始菜单贴图
 27     public Texture tex_startInfo;
 28     //帮助菜单贴图
 29     public Texture tex_helpInfo;
 30 
 31     //游戏音乐资源
 32     public AudioSource music;
 33     //当前游戏状态
 34     private int gameState;
 35 
 36     // Use this for initialization
 37     void Start()
 38     {
 39         //初始化游戏状态为主菜单界面
 40         gameState = STATE_MAINMENU;
 41     }
 42 
 43     // Update is called once per frame
 44     void Update()
 45     {
 46 
 47     }
 48     void OnGUI()
 49     {
 50         switch (gameState)
 51         {
 52             case STATE_MAINMENU:
 53                 //绘制主菜单界面
 54                 RenderMainMenu();
 55                 break;
 56             case STATE_OPTION:
 57                 //绘制游戏设置界面
 58                 RenderOption();
 59                 break;
 60             case STATE_HELP:
 61                 //绘制游戏帮助界面
 62                 RenderHelp();
 63                 break;
 64             case STATE_EXIT:
 65                 //绘制游戏退出界面
 66                 //目前直接关闭并退出游戏
 67                 break;
 68             default:
 69                 break;
 70         }
 71     }
 72     /// <summary>
 73     /// 绘制游戏帮助界面
 74     /// </summary>
 75     private void RenderHelp()
 76     {
 77         GUI.skin = mySkin;
 78         GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), tex_helpInfo);
 79         //返回按钮
 80         if (GUI.Button(new Rect(0, 500, 403, 78), "", "back"))
 81         {
 82             gameState = STATE_MAINMENU;
 83         }
 84     }
 85     /// <summary>
 86     /// 绘制游戏设置界面
 87     /// </summary>
 88     private void RenderOption()
 89     {
 90         GUI.skin = mySkin;
 91         GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), textureBG);
 92 
 93         //开启音乐按钮
 94         if (GUI.Button(new Rect(0, 0, 403, 75), "", "music_on"))
 95         {
 96             if (!music.isPlaying)
 97             {
 98                 //播放音乐
 99                 music.Play();
100             }
101         }
102         //关闭音乐按钮
103         if (GUI.Button(new Rect(0, 200, 403, 75), "", "music_off"))
104         {
105             //关闭音乐
106             music.Stop();
107         }
108         //返回按钮
109         if (GUI.Button(new Rect(0, 500, 403, 78), "", "back"))
110         {
111             gameState = STATE_MAINMENU;
112         }
113     }
114     /// <summary>
115     /// 绘制主菜单界面
116     /// </summary>
117     private void RenderMainMenu()
118     {
119         //设置界面皮肤
120         GUI.skin = mySkin;
121         //绘制游戏背景图
122         GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), textureBG);
123 
124         //开始游戏按钮
125         if (GUI.Button(new Rect(0, 30, 623, 153), "", "start"))
126         {
127             //进入开始游戏状态
128             Application.LoadLevel("Game");
129         }
130         //游戏选项按钮
131         if (GUI.Button(new Rect(0, 180, 623, 153), "", "option"))
132         {
133             //处于开始游戏状态
134             gameState = STATE_OPTION;
135         }
136         //游戏帮助按钮
137         if (GUI.Button(new Rect(0, 320, 623, 153), "", "help"))
138         {
139             //进入游戏帮助状态
140             gameState = STATE_HELP;
141         }
142         //游戏退出按钮
143         if (GUI.Button(new Rect(0, 470, 623, 153), "", "exit"))
144         {
145             //退出游戏
146             Application.Quit();
147         }
148     }
149 }

 

Tools

 

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class Tools : MonoBehaviour
 5 {
 6 
 7     /*===============================
 8      * 工具脚本
 9      *==============================*/
10 
11 
12     /// <summary>
13     /// 
14     /// </summary>
15     /// <param name="x">绘制数字 x坐标</param>
16     /// <param name="y">绘制数字 y坐标</param>
17     /// <param name="number">需要绘制的数字</param>
18     /// <param name="texnumber">绘制图片数组资源</param>
19     public static void DrawImageNumber(int x, int y, int number, Object[] texnumber)
20     {
21         //将整数数据转换为字符数组
22         char[] chars = number.ToString().ToCharArray();
23         //计算图片的宽度与高度,因为每张图片都是一样大。所以这里获取第一张即可
24         Texture2D tex = (Texture2D)texnumber[0];
25         int width = tex.width;
26         int height = tex.height;
27 
28         //遍历字符数组
29         foreach (char item in chars)
30         {
31             //得到每一位整型数组
32             int i = int.Parse(item.ToString());
33             //绘制图片数字
34             GUI.DrawTexture(new Rect(x, y, width, height), texnumber[i] as Texture2D);
35             x += width;
36         }
37     }
38 
39 }

 

 

注意事项:NPC需要添加标签:enemy

 

游戏源码:

 http://pan.baidu.com/s/1ntmOQnf

 

unity3d-游戏实战突出重围,整合游戏

标签:

原文地址:http://www.cnblogs.com/niboy/p/4266451.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!