首页 > 代码库 > unity3d-游戏实战突出重围,整合游戏
unity3d-游戏实战突出重围,整合游戏
结构图:
两个场景,一个是开始界面。一个是游戏界面:
脚本说明:依次是:敌人脚本,主角游戏,主菜单,工具
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 onm ouseDown()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 onm ouseUp()181 {182 //击打后退还原183 transform.Translate(Vector3.forward * Time.deltaTime * 1);184 }185 void onm ouseOver()186 {187 //开始绘制血条188 showBlood = true;189 }190 void onm ouseExit()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 //找到所有的NPC160 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 else183 {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-游戏实战突出重围,整合游戏
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。