iphone好玩的射击游戏第一人称射击游戏

大小: 665.83
评级:4星(共811份评分)
价格:¥12元
银河系的命运危在旦夕!iOS上备受好评的《死亡空间》制作组,为您带来全新的《质量效应》原创剧情——专为移动平台设计!您是CERBERUS特工——但已经不听将令!在Commander Shepard与Reapers在银河系各地展开激战的同时,Cerberus经验丰富的特工Randall Ezno在获取外星人,用于某秘密研究所中的违法实验。但是研究所长官不择手段——Randall则逆戈相击,誓要击溃Cerberus!您能否突破Cerberus基地的重围,将它们的秘密研究交给地球联盟?
大小: 1.57
评级:4.5星(共2972份评分)
价格:¥45元
智能手机上最为精彩刺激的科幻类FPS大作强势回归!在移动设备上最棒的射击游戏中为人类存亡奋勇而战!离卡尔破坏福尔特人的战争工厂,毁掉他们征服世界的计划且成功阻止审判者神器被窃用已经过去四个多月了。然而,由于总统福尔松遇刺,政府为了避免与不断增长的亲福派公民发生内战,被迫将殖民地割让给了福尔特宗主国。福尔松死后,一直淡出大众视野的卡尔突然收到了一封来自叶莲娜的紧急求助信,恳请他返回地球,终于,昔日英雄重回故土,重新肩负起拯救人类的重任!
大小: 535.13
评级:5星(共1464份评分)
价格:¥45元
标志性的彩虹部队最终登陆iPad!享受给你带来全新体验的第一人称射击游戏,领导一支由精英兵士组成的特别队伍!
一个国际恐怖组织威胁到了世界的平衡格局。只有一支队伍能够阻止它:彩虹部队!
他们是永不褪色的彩虹。
极具代表性的品牌终于登陆iPad
最流行的游戏品牌之一终于成功登陆iPad。
大小: 567.94
评级:4.5星(共477份评分)
价格:¥45元
《现代战争》首作的游戏性首屈一指,堪称FPS典范。而这一点在《现代战争2:黑色飞马》中更得到了进一步提升:颇具代入感的现代大战不但令人称奇,更使人沉浸其中。此外,您更可领略iPhone上最完善的FPS多人游戏体验。
大小: 1.09
评级:4.5星(共5489份评分)
价格:¥45元
智能手机上最好最真实的FPS系列游戏王者归来,带来更加紧张的体验和启示性的战争——为了美国的自由而战,可参与单人或多人游戏。
大小: 1.48
评级:4.5星(共2201份评分)
价格:¥45元
现代战争4:决战时刻是《现代战争》系列最新作品,这款游戏成功地延续了系列作品的优点,既有紧张刺激的单人战役也有一系列对战模式,并且这两方面与前作相比都有了长足的进步,十分刺激。注:游戏原文件较大,建议用iFanbox本地高速下载。
大小: 425 MB
评级:5星(共104514份评分)
现在你可以免费进行饱受赞誉的兄弟连系列游戏!准备步入二战中最紧张激烈最火爆的战场。免费游戏免费下载和进行游戏的故事模式或多人游戏模式。苹果I派党小编提示你,这是一个完整版的游戏。你可以通过在游戏中获取铭牌和经验值,慢慢地解锁数不胜数的额外特色内容和装备,自定义你的士兵,或购买勋章以更快地解锁它们。一切由你做主!在线加入你的盟军在5幅多人游戏地图和3种游戏模式(混战、团队死亡赛和控制赛)中,挑战最多5名好友。你可以通过本地蓝牙或通过WLAN连接网络,与任意地点的好友交战。
大小: 197.03
评级:4星(共38份评分)
价格:¥6元
沙漠僵尸:背水一战是一款射击生存的僵尸游戏~沙漠僵尸提供了一个身临其境,动感十足的战争体验,战斗生存的武装,和狡猾可怕的成群僵尸战斗。解锁玩家福利,人物和成就的全部武器。无尽的生存地图,5个游戏人物,打开属于你的完整的武器库。
大小: 192.64
评级:4星(共42份评分)
价格:¥30元
The benchmark for realistic modern war games now arrives on iPad!
**Touch Arcade: “An excellent game that raises the bar of what is to be expected of f
大小: 130.98
评级:4星(共5885份评分)
现在,风靡的iSniper3D再次归来。您的现代战争开启,获得不一样的武器来体验不一样的战争风情。你是一个狙击手——Glous Miller,因谋杀被判入狱。GST的Adam劝服你假释出狱帮助GST对付已经发现的威胁——TRINITI。在行动调查中遇到了神秘的女人——Rebecca。在Adam那里获知,Rebecca是GST最好的观察员;在合作执行任务之中非常愉快,然而事实却……
大小: 42.66
评级:4星(共106份评分)
***原价¥18元(人民币),现在免费***战斗或死?勇士们再次面临抉择!New Ipad 平台的射击游戏王者强势回归!这次的CF Defense 2将带来更多的武器和关卡, 更多样的武器改造方案, 当然还有更凶恶的敌人!面对敌人海、陆、空三军的联合突袭, 你的英勇无畏是我军最后的希望!拿起你的机枪, 将胆敢踏上海滩的敌人全部消灭!祝你好运!,游戏通过重力系统实现瞄准,玩家通过上下左右倾斜iPhone即可将机枪火炮操控自如,玩起来临场感倍增!想寻找好玩刺激的游戏?不要太贵?来试试CF Defense 2吧,它将是你的最佳选择!
大小: 28.53
评级:4星(共105份评分)
***原价¥12元(人民币),现在免费***游戏开始时赠送20000游戏金币!狼眼突袭(The Raid Of Wolve)是由数码蚂蚁设计开发的一款3D画面第一人称射击游戏,采用了经典抢滩登陆的游戏玩法模式,游戏将带您进入到现代防御战争的风暴中心,身临其境感受现代战争中的恢宏与厚重,领略真实战场的魅力,重寻第一人称射击游戏最初的感动。
大小: 522.26
评级:4星(共76份评分)
价格:¥30元
经典动作加潜入类游戏大作,首次登陆iPad!
尽情演绎特工山姆.费舍尔的战斗技巧您将扮演山姆.费舍尔,一位身怀绝技的特工进行游戏。打败黑暗地下机构并救回你的女儿。循着阴谋的踪迹,从伊拉克一直到华盛顿的高机密大楼。使用手枪,散弹枪,АК-47突击步枪和火箭筒。运用跑、跳、攻击、以及射击等动作,或者利用环境中的物体来掩护自己。你现在是一名变节特工,除了自己,你不用服从任何人的命令!
大小: 580.47
评级:4星(共212份评分)
价格:¥45元
终级科幻一人称射击游戏归来!做好准备,您即将步入苹果设备游戏的新境界!
更好,更快,更强大!
- 与高级AI控制的全新版敌人交火!Volterites的全新策略让陀螺仪控制更加完美
- 掌控大量的武器装备及能力
- 大量更加多样化的游戏玩法:奔跑,设计,跪倒,驾驶摩托车,驾驶巨型机械,使用激光攻击
大小: 268.44
评级:3.5星(共124份评分)
价格:¥18元
我们有史以来规模最大、最具震撼力的第一人称射击游戏首次登陆APP STORE。根据DICE出品的畅销主机游戏改编,在丛林、雪地以及荒漠战场与敌人进行近距离和空中交战。
运用直观易懂的操作,在这场先进载具的战争中用坦克和直升机摧毁敌人。即刻享受完整的在线多人游戏模式,获得称霸iPhone& & iPod touch&平台的模拟现代战争体验。
大小: 510.19
评级:4星(共441份评分)
价格:¥30元
这是一个射击游戏。你要扮演山姆,他是一个身手很好的特种兵。你的任务是破坏一个秘密机构,就出你的女儿。游戏会给你提供线索让你去完成任务,你的武器有手枪,猎枪,支AK47和火箭筒。特点:-完美的3D地图,令人惊讶的游戏环境-游戏有11级,从马耳他到白宫有8个地点-先进的游戏设置,战斗中你可以快速标记多个目标,一次全部消灭
大小: 155.51
评级:3.5星(共206份评分)
价格:¥30元
N.O.V.A.是一款射击类游戏,如果你想体验类似PC游戏《光晕》的感觉,N.O.V.A.绝对值得一试。该游戏的控制简单直观,iPad的触摸屏让游戏体验更佳,超过iPhone版本。
开发者交流群:3467414
(加群请输入:来自苹果i派党)
开发者服务您现在的位置: >
像素行动2下载 像素风格现代第一人称射击
支持平台:
游戏介绍:
  像素行动2是一款像素风格的现代军事射击游戏,游戏是以第一人称进行的。这款游戏延续了上一部的风格,简单而又幽默,变化最大的就是该游戏的场景变化最大了,但是又把游戏的可玩性提升到很不错的高度,你如果非藏喜欢第一部的话,第二部是肯定不能错过的。
游戏截图:
图解新闻:
最新攻略:
热门排行本周本月
热门手机排行榜
排名产品价格u3d5第一人称射击游戏(C#脚本)完整版并在iOS9.3系统上真机运行
涉及U3D的功能有:摄像机控制、物理、动画、智能寻路等。
开发工具:Unity3D5.3.4,VS2015,VMplayer12+MacOSX10.11+XCode7.3(我是Windos笔记本用的是苹果虚拟机,MAC真机不需要虚拟机,直接在appstore下载XCode最新版本就可以了,MAC最新版+Xcode最新版本可以直接真机调试运行)+OS9.3系统iphone
说一下U3D,想要在ios上调试的话就要在下载的时候勾选ios的插件,如果你之前没勾选的话就需要重新下载,可以直接勾选ios其他的都不勾选,我就是重新下载的unity。
制作的是完整版的游戏,包括开始游戏界面,排行榜界面,游戏介绍界面。。。
游戏制作中遇到的问题(下文都将一一解答):
1.场景切换问题:因为是自学,参考书上面只说了游戏的制作,并没有场景的切换,也就是开始游戏,游戏介绍的场景界面这些
2.怎么编译到iOS
3.VS2015(C#脚本编辑器) 使用30天后无法正常使用
4.Win7系统里面调好的尺寸在iphone上并不可用,后来我根据iphone改变的尺寸,下面我的截图是win7上unity的截图,所以尺寸大家不要介意
游戏中遇到的未解决问题
.我游戏里面用到的摇杆是EasyTouch3插件,然后添加摇杆后,start游戏可以正常使用摇杆,但是一旦我选择重新加载游戏或者退出游戏再开始游戏时,就会报错MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it.Your script should either check if it is null or you should not destroy the object.
这一问题困扰了我很多天,我也在网上找了好多资料,但是最终没有找到解决的办法,我试过的解决办法如下:
1.将摇杆放到Player游戏体下层不可行。
2.删除控制摇杆脚本里面的OnEnable方法不可行。
3.添加OnDestory方法不可行
void OnDestory() {
EasyJoystick.On_JoystickMove -= OnJoystickM
EasyJoystick.On_JoystickMoveEnd -= OnJoystickMoveE
4.将两个摇杆的脚本都添加到Player游戏体上不可行
5.在GameManager中,点击重新开始或退出游戏时destory摇杆游戏体
Can't destroy Transform component of 'Joystick'. If you want to destroy the game object, please call 'Destroy' on the game object instead. Destroying the transform component is not allowed.
不可行!!
6.添加脚本为不可删除的cantdestory(this);不可行!
所以我放弃了解决这个bug。
完整游戏工程http://download.csdn.net/detail/v1 需要下载积分5分解压后直接用unity打开
游戏资源http://download.csdn.net/detail/v2 需要下载积分1分解压后导入工程 Assets-&Import New Assets
U3D摇杆插件 EasyTouch下载地址 http://download.csdn.net/detail/v1
下面开始教程
首先在win7系统使用U3D制作游戏,之后再编译成iOS,导入虚拟机中iPhone真机调试
1开始游戏的场景:
打开Unity3D新建一个工程,包括起名字和存储地址等等,不多说
我的开始游戏的场景是这样的
背景图案+3个button按钮
背景图案:1在场景里面新建一个Plane GameObject-&3DObject-&Plane 选中Plane,在Inspector下的Transform设置Reset(养成良好的习惯,新建一个GameObject就将其Transform,Reset一下,然后在调整你想要的位置)
2 然后在project新建一个材质球(project里面的文件最好统一分类,脚本文件夹,材质球图片文件夹等等),将材质球的Shader选为LegacyShader-&Diffuse
3引入想要做背景的图片右键project下面保存想要保存图片的文件夹(文件夹自己创建或是默认文件夹,但是要有良好的分类习惯)
4然后选中图片,拖入到材质球的select框里面,或者直接在材质球select想要的图片
5选中之前创建的Plane,将材质球拖到Plane上面,这样Plane就能显示我们想要的图片了
接下来调整摄像机,让其对准Plane,如下图,将MainCamera的Projection设置成Oithograhpic(这是将摄像机垂直向下)然后调整摄像机的位置,高度,适当调整Plane的尺寸,然后在Game界面浏览一下,像我这样子就可以了。
接下来就是用脚本控制显示游戏名称,和开始游戏、游戏介绍、排行榜的三个button了
在场景里新建一个空游戏体GameObject-&CreateEmpty然后在project新建一个C#脚本命名GameManagerStart,将脚本拖到空游戏体上(默认的名字就是GameObject,我没改名,所以上图显示的GameObject就是我创建的空游戏体),接下来就是理解脚本了。
using UnityE
using System.C
public class GameManagerStart : MonoBehaviour {
// Use this for initialization
void Start () {
// Update is called once per frame
void Update () {
void OnGUI() {
GUI.skin.label.fontSize = 240;
//设置label的字体大小
GUI.skin.label.alignment = TextAnchor.UpperC
//设置label的对齐方式
GUI.Label(new Rect(0, 20, Screen.width, 1000), &密
//游戏名称的label
GUI.skin.button.fontSize = 100;
if (GUI.Button(new Rect(Screen.width * 0.5f - 200, Screen.height * 0.3f, 400, 140), &开始闯关&)) {
Application.LoadLevel(&demo&);
if (GUI.Button(new Rect(Screen.width * 0.5f - 200, Screen.height * 0.5f, 400, 140), &游戏介绍&)) {
Application.LoadLevel(&Instruction&);
if (GUI.Button(new Rect(Screen.width * 0.5f - 200, Screen.height * 0.7f, 400, 140), &最高得分&)) {
Application.LoadLevel(&paihangbang&);
脚本解析:
using UnityE
using System.C
这两行代码引入两个类 Start()Updata()函数都是C#脚本开始便自带的函数
Start()是程序开始的时候执行一次,Updata()是每一帧都执行,在此脚本中我都没有用到这两个函数
OnGUI()函数是显示UI的函数,也是每一帧都执行的函数
if (GUI.Button(new Rect(Screen.width * 0.5f - 200, Screen.height * 0.3f, 400, 140), &开始闯关&)) {
Application.LoadLevel(&demo&);
这段代码是直接创建一个button,并设置button的rect和名称,如果点击button后执行加载场景demo的操作,3个button对应三个场景,现在还没有其它的场景,可以先将加载场景的代码注释掉,等创建了其它场景再解开注释。
运行一下就可以看到和我上面图片一样的开始游戏界面效果了,保存场景,起名为start。File-&SaveScene,保存到project里面,就是刚开始创建游戏的位置,找到project里面你想保存的文件夹,或新建一个文件夹专门保存游戏场景。下图是我保存场景的地方
2游戏介绍场景,最高得分场景
跟开始场景差不多
就是新建场景File-&new Scene
然后按照上面start场景的操作做就可以了
游戏介绍场景加代码:
using UnityE
using System.C
public class GameManagerInstrection : MonoBehaviour {
// Use this for initialization
void Start () {
// Update is called once per frame
void Update () {
void OnGUI() {
GUI.skin.label.alignment = TextAnchor.UpperC
GUI.skin.label.fontSize = 100;
GUI.Label(new Rect(0, 200, Screen.width, Screen.height), &一款模拟CS&);
GUI.Label(new Rect(0, 340, Screen.width, Screen.height), &3D射击游戏&);
GUI.Label(new Rect(0, 490, Screen.width, Screen.height), &Here we go?&);
GUI.skin.button.fontSize = 100;
if (GUI.Button(new Rect(Screen.width * 0.5f-140, Screen.height * 0.7f, 280, 100), &GO&)) {
Application.LoadLevel(&start&);
最高得分的场景就不截图了,下面是最高得分的GameManager的代码
最高分的场景我原来是想做分数排行的,固定显示一个最高分数,然后每次有新的记录的时候,再添加到那几个分数当中,但是后来没有做到,我就只显示了一个最高分
这里说一下怎么保存游戏最高得分,利用PlayerPrefs的set和get方法,在后面的demo场景中会set游戏得分,在本场景中get得分,然后显示出来,也只是临时存储,再次启动游戏记录也就没有了,我查过最好是用XML存储游戏分数,但是就算XML存储游戏分数,我显示并替换分数的逻辑没有想明白,因为我是用OnGUI来显示分数的,但是OnGUI是每一帧都执行的,所以,应该不用OnGUI来显示分数。如果谁有好的想法的话可以加我微信,谢谢了。微信:lidi55
using UnityE
using System.C
public class GameManagerPHBang : MonoBehaviour {
Transform m_
int m_score = 0;
System.DateT
void Start () {
m_transform = this.
m_score = PlayerPrefs.GetInt(&Score&,0);
void Update () {
void OnGUI() {
GUI.skin.button.fontSize = 100;
if (GUI.Button(new Rect(Screen.width * 0.8f, Screen.height * 0.8f, 280, 100), &GO&))
Application.LoadLevel(&start&);
GUI.skin.label.alignment = TextAnchor.UpperC
GUI.skin.label.fontSize = 30;
now = System.DateTime.N
string date = now.Year.ToString() + &/& + now.Month.ToString() + &/& + now.Day.ToString() +&
GUI.Label(new Rect(0, Screen.height*0.1f, 400, 80), date);
接下来是重头戏:demo场景
demo场景里面会用到很多资源,我把需要用到的游戏资源上传一份,上面有链接。
新建demo场景,并且导入游戏资源后,选择level下的3个模型,然后在菜单栏选择Component-&Physics-&MeshCollider为其添加多边形碰撞体组建,现在场景模型既可以用于显示,也可以用于碰撞。然后把3个模型的MeshCollider组件的IsTrigger取消勾选,is Trigger:如果勾选了该属性,那么该物体就是一个虚体,有形而无实,不受力的作用,其它对象可以穿过它。
下面我们制作主角
因为是第一人称射击,所以主角不可见,弄个枪就行了,但是还是要为主角创建碰撞体并控制其移动。
创建一个空游戏体,起名为Player,将它的Tag也设为Player(点击右上角的Tag,AddTag就可以添加Tag了),这就是主角了。
在菜单栏选择Component-&Physics-&CharacterController为主角添加游戏控制器组件,该组件可以让我们控制主角的移动,也可以产生碰撞,比如行走时不会穿到墙里。
为主角添加Rigidbody组件,取消UseGravity去掉重力模拟,并选中IsKinematic使其不受物理演算影响,这样就可以用脚本控制其移动。CharacterController组件中可以调整碰撞体的位置和大小,如下图。
是第一人称射击游戏,所以摄像机就是主角的视角,所以在后面的脚本中会控制摄像机跟随主角的视角,摄像机还要显示一把枪出来,这把枪在视觉上代替主角。
将摄像机的Camera组件下的ClippingPlane/near设置为0.1,使其可以看到更近的物体,然后找到引入的文件M16.Prefab,这是预设好的武器Prefab,是一个简单的枪支模型。将其拖入到Hierarchy窗口的摄像机层级下,使其成为摄像机的子物体。然后选择Prefab下一级的枪模型weapon,调整他的位置和角度,在CameraPreview中预览效果,直到满意为止。
直接上Player的脚本,脚本要拖到Player游戏体上
using UnityE
using System.C
public class Player : MonoBehaviour {
public Transform m_
//定义自己的Transform
Transform m_
//这个是加在摄像机下面枪模型的枪口位置,主角射击的时候用到的Transform
public LayerMask m_
//定义射击时,可以击中的碰撞层
public Transform m_
//射击特效
public AudioClip m_
//射击声音
public CharacterController m_
//主角的CharacterController组件
float m_movSpeed = 8.0f;
//主角的移动速度
float m_gravity = 0.1f;
//主角受到的重力
public int m_life = 5;
//主角的起始生命
Transform m_camT
//摄像机Transform
float m_camHeight = 0.5f;
//定义的摄像机的高度,即主角的视角高度
// Use this for initialization
void Start () {
m_transform = this.
//将Player的Transform给m_transform
m_ch = GetComponent();
//获取CharacterController组件
m_camTransform = Camera.main.
//获取摄像机,将摄像机的Transform给m_camTransform
Vector3 pos = m_transform. //获取主角面向的方向
pos.y += m_camH
//主角面向的方向加上摄像机的高度
m_camTransform.position =
//然后赋值给摄像机面向的方向
m_camTransform.rotation = m_transform.
//主角的旋转角度给摄像机的旋转角度
m_muzzlepoint = m_camTransform.FindChild(&M16/weapon/muzzlepoint&).//获取枪头位置
// Update is called once per frame
void Update () {
if (m_life &= 0||Time.timeScale == 0)
Control();
public void Shoot() {
if (Time.timeScale == 1) {
this.GetComponent().PlayOneShot(m_audio);
GameManager.Instance.SetAmmo(1);
bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward),
out info, 100, m_layer);
if (hit) {
if (info.pareTo(&enemy&) == 0)
Enemy enemy = info.transform.GetComponent();
enemy.OnDamage(1);
Instantiate(m_fx, info.point, info.transform.rotation);
void Control ()
//在Updata()里面调用,所以以后开始游戏的每一帧都都让摄像机的position和主角的一样
//WASD控制方向,但是移植到iPhone上面以后就需要摇杆控制了
float xm = 0;
float ym = 0;
float zm = 0;
ym -= m_gravity * Time.deltaT
if (Input.GetKey(KeyCode.W))
zm += m_movSpeed * Time.deltaT
else if (Input.GetKey(KeyCode.S))
zm -= m_movSpeed * Time.deltaT
if (Input.GetKey(KeyCode.A))
xm -= m_movSpeed * Time.deltaT
else if (Input.GetKey(KeyCode.D))
xm += m_movSpeed * Time.deltaT
m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));
//Control()方法到这为止,前面是WASD控制方向,但是移植到iPhone上面以后就需要摇杆控制了,所以下面的代码才是主要的
//是控制摄像机跟随主角的视角
Vector3 pos = m_transform.
pos.y = m_camH
m_camTransform.position =
void OnGizmos() {
//在场景中显示一个图标来标识一下这个是主角,运行游戏后没有实际作用
Gizmos.DrawIcon(transform.position, &Spawn.tif&);
//下面是主角和敌人交互时的函数,如果敌人攻击了主角,主角生命值减少
public void OnDamage (int damage) {
GameManager.Instance.SetLife(m_life);//GameManager控制游戏屏幕显示的一些东西,后面会说到它
脚本解析:
开始的时候要设置摄像机的角度、位置(还有高度)与player相同
void Update () {
if (m_life &= 0||Time.timeScale == 0)
Control();
如果生命值小于0,让timeScale为0,在后面的GameManager里面设置了,如果timeScale为0时,就弹出Game Over等,如下就是GameManager代码
if (m_player.m_life &= 0)
Time.timeScale = 0;
GUI.skin.label.alignment = TextAnchor.MiddleC
GUI.skin.label.fontSize = 120;
GUI.Label (new Rect(0, -160, Screen.width, Screen.height), &Game Over&);
GUI.skin.button.fontSize = 50;
if (GUI.Button(new Rect(Screen.width*0.5f-150, Screen.height*0.4f, 300, 60), &Try again&))
Application.LoadLevel(&demo&);
if (GUI.Button(new Rect(Screen.width * 0.5f-150, Screen.height * 0.6f, 300, 60), &退出游戏&)) {
// m_gameManagerPHB.SetPlayerScore();
PlayerPrefs.SetInt(&Score&, m_score);
Application.LoadLevel(&start&);
Control();
函数是控制摄像机旋转角度与位置和主角相同,还有就是控制主角的移动和视角调制,前面的代码里面是包含WASD控制方向的,还有鼠标控制的代码如下,但是最后要移植到手机上这俩个方法是不行的,需要添加摇杆,添加摇杆的方法在后面说。
float rh = Input.GetAxis(&Mouse X&);
float rv = Input.GetAxis(&Mouse Y&);
m_camRot.x -=
m_camRot.y +=
m_transform.eulerAngles = m_camR
这是鼠标控制旋转,但是要在start()函数里面锁定鼠标,Screen.lockCursor =
shoot函数是射击函数,在GameManager脚本里面进行调用,因为在GameManager脚本里面我放了射击按钮
如果timeScale为1的时候,就可以进行射击
获取AudioSourse组件调用playOneShoot函数用来发出声音,audio参数是在游戏体上添加的,想要在游戏体上添加或调整参数就赢该将属性设置成public
GameManager.Instance.SetAmmo(1);就是让子弹的数量减一,射击当然要减了。
bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward),
out info, 100, m_layer);
if (hit) {
if (info.pareTo(&enemy&) == 0)
Enemy enemy = info.transform.GetComponent();
enemy.OnDamage(1);
射线射击,如果射到敌人,敌人生命减一
Instantiate(m_fx, info.point, info.transform.rotation);
敌人脚本:
using UnityE
using System.C
public class Enemy : MonoBehaviour {
Transform m_
protected EnemySpawn m_
protected EnemySpawn1 m_spawn2;
Animator m_
NavMeshAgent m_
public float m_movSpeed = 0.5f;
float m_rotSpeed = 120;
float m_timer = 2;
int m_life = 15;
// Use this for initialization
void Start () {
m_transform = this.
m_ani = this.GetComponent();//动画组件
m_player = GameObject.FindGameObjectWithTag(&Player&).GetComponent();
m_agent = GetComponent();//寻路组件
m_agent.SetDestination(m_player.m_transform.position);//开始就向player进行寻路
// Update is called once per frame
void Update () {
if (m_player.m_life &= 0)
if (GameManager.Instance.level == 3)
m_movSpeed = 100.0f;//这是第三个难度,提高敌人移动速度
AnimatorStateInfo stateInfo = m_ani.GetCurrentAnimatorStateInfo(0);//当前的动画状态
//下面是敌人的三个状态时的处理代码
if (stateInfo.nameHash == Animator.StringToHash(&Base Layer.idle&) &&
! m_ani.IsInTransition(0))//处于待机状态且不处于孤独状态
m_ani.SetBool(&idle&, false);
m_timer -= Time.deltaT
if (m_timer & 0)
if (Vector3.Distance(m_transform.position, m_player.m_transform.position) & 5f)
m_ani.SetBool(&attack&, true);
m_timer = 1;
m_agent.SetDestination(m_player.m_transform.position);
m_ani.SetBool(&run&, true);
if (stateInfo.nameHash == Animator.StringToHash(&Base Layer.run&) &&
! m_ani.IsInTransition(0))
m_ani.SetBool(&run&, false);
m_timer -= Time.deltaT
if (m_timer & 0)
m_agent.SetDestination(m_player.m_transform.position);
m_timer = 1;
if (Vector3.Distance(m_transform.position, m_player.m_transform.position) &= 5f)
m_agent.ResetPath();
m_ani.SetBool(&attack&, true);
if (stateInfo.nameHash == Animator.StringToHash(&Base Layer.attack&) &&
! m_ani.IsInTransition(0))
RotateTo();
m_ani.SetBool(&attack&, false);
if (stateInfo.normalizedTime &= 1.0f)
m_ani.SetBool(&idle&, true);
m_timer = 2;
m_player.OnDamage(1);
if (stateInfo.nameHash == Animator.StringToHash(&Base Layer.death&)
&& ! m_ani.IsInTransition(0))
if (stateInfo.normalizedTime &= 1.0f)
OnDeath();
//GameManager.Instance.SetScore(100);
//Destroy(gameObject);
void RotateTo () {
//转向Player
Vector3 oldangle = m_transform.eulerA
m_transform.LookAt(m_player.m_transform);
float target = m_transform.eulerAngles.y;
float speed = m_rotSpeed * Time.deltaT
float angle = Mathf.MoveTowardsAngle(oldangle.y, target, speed);
m_transform.eulerAngles = new Vector3(0, angle, 0);
public void OnDamage (int damage) {
//减少生命值
if (m_life &= 0)
m_ani.SetBool(&death&, true);
public void Init(EnemySpawn spawn) {
//生成器1的计数器
m_spawn.m_enemyCount++;
public void Init2(EnemySpawn1 spawn) { //生成器2的计数器
m_spawn2 =
m_spawn2.m_enemyCount++;
public void OnDeath () {
if (GameManager.Instance.level == 1)
m_spawn.m_enemyCount--;
else if (GameManager.Instance.level == 2||GameManager.Instance.level==3)
m_spawn2.m_enemyCount--;
GameManager.Instance.SetScore(100);
Destroy (this.gameObject);
两个生成器
等级1的时候的生成器:
using UnityE
using System.C
public class EnemySpawn : MonoBehaviour {
public Transform m_
public int m_enemyCount = 0;
public int m_maxEnemy =3;
protected Transform m_
// Use this for initialization
void Start () {
m_transform = this.
// Update is called once per frame
void Update () {
public void CreatEnemy() {
if (m_enemyCount &= m_maxEnemy)
Transform obj = (Transform)Instantiate(m_enemy, m_transform.position, Quaternion.identity);
Enemy enemy = obj.GetComponent();
enemy.Init(this);
void OnDrawGizmos () {
Gizmos.DrawIcon(transform.position, &item.png&, true);
等级2的时候的生成器:
using UnityE
using System.C
public class EnemySpawn1 : MonoBehaviour {
public Transform m_
public int m_enemyCount = 0;
public int m_maxEnemy = 8;
protected Transform m_
// Use this for initialization
void Start () {
m_transform = this.
// Update is called once per frame
void Update () {
public void CreatEnemy()
if (m_enemyCount &= m_maxEnemy)
Transform obj = (Transform)Instantiate(m_enemy, m_transform.position, Quaternion.identity);
Enemy enemy = obj.GetComponent();
enemy.Init2(this);
void OnDrawGizmos()
Gizmos.DrawIcon(transform.position, &item.png&, true);
GameManager:
using UnityE
using System.C
public class GameManager : MonoBehaviour {
Transform m_
public static GameManager Instance =
public int m_score = 0;
static int m_hiscore = 0;
int m_ammo = 100;
public float m_timer_shoot = 0.1f;
public float m_timer_creatEnemy = 0;
public int level = 0;
EnemySpawn m_enemyS
EnemySpawn1 m_enemySpawn1;
//GameManagerPHBang m_gameManagerPHB;
GUIText txt_
GUIText txt_
GUIText txt_
GUIText txt_
// Use this for initialization
void Start () {
m_transform = this.
Instance =
m_player = GameObject.FindGameObjectWithTag(&Player&).GetComponent();
m_enemySpawn = GameObject.FindGameObjectWithTag(&EnemySpawn&).GetComponent();
m_enemySpawn1 = GameObject.FindGameObjectWithTag(&EnemySpawn1&).GetComponent();
foreach (Transform t in this.transform.GetComponentsInChildren()) {
if (pareTo(&txt_ammo&) == 0)
txt_ammo = t.GetComponent();
else if (pareTo(&txt_hiscore&) == 0)
txt_hiscore = t.GetComponent();
else if (pareTo(&txt_life&) == 0)
txt_life = t.GetComponent();
else if (pareTo(&txt_score&) == 0) {
txt_score = t.GetComponent();
Time.timeScale = 1;
// Update is called once per frame
void Update () {
if (Time.timeScale & 0 && Input.GetKeyDown(KeyCode.Escape))//游戏中按ESC
Time.timeScale = 0;
Screen.lockCursor =//前面要是没锁定鼠标,这里也不需要解锁鼠标
m_timer_creatEnemy -= Time.deltaT
if (m_timer_creatEnemy &= 0)
m_timer_creatEnemy = Random.value * 15.0f;
if (m_timer_creatEnemy & 5)
m_timer_creatEnemy = 5;
if (m_score & 1000)
level = 1;
m_enemySpawn.CreatEnemy();
else if (m_score&=1000 && m_score& 2000)
level = 2;
m_enemySpawn1.CreatEnemy();
else if (m_score &= 2000)
level = 3;
//Enemy.Instance.m_movSpeed = 5.0f;
m_enemySpawn1.CreatEnemy();
public void SetScore (int score) {
m_score +=
if (m_score & m_hiscore)
m_hiscore = m_
txt_score.text = &Score &+m_
txt_hiscore.text = &High Score &+m_
public void SetAmmo (int ammo) {
if (m_ammo &= 0)
m_ammo = 100 - m_
txt_ammo.text = m_ammo.ToString() + &/100&;
public void SetLife (int life) {
txt_life.text = life.ToString();
void OnGUI () {
GUI.skin.label.fontSize = 30;
GUI.skin.label.alignment = TextAnchor.LowerC
GUI.Label(new Rect(0,0,Screen.width,Screen.height), &Level& + level);
GUI.skin.label.fontSize = 30;
GUI.skin.label.alignment = TextAnchor.MiddleC
if (GUI.Button(new Rect(30, 0, 100, 30), &。。。&) && Time.timeScale & 0)
Time.timeScale = 0;
Screen.lockCursor =
if (Time.timeScale == 0 && m_player.m_life&0) {
GUI.skin.label.alignment = TextAnchor.MiddleC
GUI.skin.label.fontSize = 120;
if (GUI.Button(new Rect(Screen.width * 0.5f-150, Screen.height * 0.3f, 300, 60), &继续游戏&)) {
Time.timeScale = 1;
//Screen.lockCursor =
if (GUI.Button(new Rect(Screen.width * 0.5f - 150, Screen.height * 0.5f, 300, 60), &重新开始&)) {
//Destroy(joy1.transform);
Application.LoadLevel(&demo&);
if (GUI.Button(new Rect(Screen.width * 0.5f-150, Screen.height * 0.7f, 300, 60), &退出游戏&)) {
//m_gameManagerPHB.SetPlayerScore();
PlayerPrefs.SetInt(&Score&,m_score);
Application.LoadLevel(&start&);
//Application.Quit();这行代码控制直接退出整个游戏了
if (m_player.m_life &= 0)
Time.timeScale = 0;
GUI.skin.label.alignment = TextAnchor.MiddleC
GUI.skin.label.fontSize = 120;
GUI.Label (new Rect(0, -160, Screen.width, Screen.height), &Game Over&);
GUI.skin.button.fontSize = 50;
if (GUI.Button(new Rect(Screen.width*0.5f-150, Screen.height*0.4f, 300, 60), &Try again&))
Application.LoadLevel(&demo&);
if (GUI.Button(new Rect(Screen.width * 0.5f-150, Screen.height * 0.6f, 300, 60), &退出游戏&)) {
// m_gameManagerPHB.SetPlayerScore();
PlayerPrefs.SetInt(&Score&, m_score);
Application.LoadLevel(&start&);
if (GUI.RepeatButton(new Rect(Screen.width * 0.8f, Screen.height * 0.7f, 100,100), img) && Time.timeScale==1) {
m_timer_shoot -= Time.deltaT
if (m_timer_shoot &= 0) {
m_player.Shoot();
m_timer_shoot = 0.1f;
接下来就是两个摇杆的代码了,参考博客:
using UnityE
using System.C
public class JoysticController : MonoBehaviour {
Transform m_
// float m_movSpeed_walk = 6.0f;
//float m_movSpeed_run = 10.0f;
// Use this for initialization
void Start () {
m_transform = this.
m_player = GameObject.FindGameObjectWithTag(&Player&).GetComponent();
//m_player = this.GetComponent();
// Update is called once per frame
void Update () {
//DontDestroyOnLoad(this);
void OnEnable()
EasyJoystick.On_JoystickMove += OnJoystickM
EasyJoystick.On_JoystickMoveEnd += OnJoystickMoveE
//移动摇杆结束
void OnJoystickMoveEnd(MovingJoystick move)
//停止时,角色恢复idle
if (move.joystickName == &Joystick&)
//animation.CrossFade(&idle&);
//移动摇杆中
void OnJoystickMove(MovingJoystick move)
if (move.joystickName != &Joystick&)
//获取摇杆中心偏移的坐标
float joyPositionX = move.joystickAxis.x;
float joyPositionY = move.joystickAxis.y;
float mx = 0;
float my = 0;
float mz = 0;
mx += joyPositionX * Time.deltaTime*10;
my -= 0.1f * Time.deltaT
mz += joyPositionY * Time.deltaTime*10;
m_player.m_ch.Move(m_player.m_transform.TransformDirection(new Vector3(mx, my, mz)));
//this.GetComponent().Move(m_transform.TransformDirection(new Vector3(mx, my, mz)));
//DontDestroyOnLoad(this);
void OnDestory() {
EasyJoystick.On_JoystickMove -= OnJoystickM
EasyJoystick.On_JoystickMoveEnd -= OnJoystickMoveE
using UnityE
using System.C
public class JoysticController2 : MonoBehaviour {
Transform m_
Transform m_camT
Vector3 m_camR
float m_camHeight = 0.5f;
// Use this for initialization
void Start () {
m_transform = this.
m_player = GameObject.FindGameObjectWithTag(&Player&).GetComponent();
m_camTransform = Camera.main.
m_camRot = m_camTransform.eulerA
// Update is called once per frame
void Update () {
void OnEnable()
EasyJoystick.On_JoystickMove += OnJoystickM
EasyJoystick.On_JoystickMoveEnd += OnJoystickMoveE
//移动摇杆结束
void OnJoystickMoveEnd(MovingJoystick move)
//停止时,角色恢复idle
if (move.joystickName == &Joystick2&)
//animation.CrossFade(&idle&);
void OnJoystickMove(MovingJoystick move)
if (move.joystickName != &Joystick2&)
//获取摇杆中心偏移的坐标
float joyPositionX = move.joystickAxis.x;
float joyPositionY = move.joystickAxis.y;
m_camRot.x -= joyPositionY * 0.8f;
m_camRot.y += joyPositionX * 0.8f;
m_camTransform.eulerAngles = m_camR
m_player.m_transform.eulerAngles = m_camTransform.eulerA
void OnDestory()
EasyJoystick.On_JoystickMove -= OnJoystickM
EasyJoystick.On_JoystickMoveEnd -= OnJoystickMoveE
我是自己创建的脚本,然后将脚本添加到两个摇杆上面了。但是有bug,就是我前面提到的未解决bug,如果你看完了,并且有解决bug的办法,加我微信吧lidi55,请指点一下我。
解决最开始所提到的问题:
1,场景切换的话看我的GameManager代码,里面的Application.LoadLevel(&场景名&);前提是你有一个以上的场景可以切换对吧,如何创建场景前面也已经说了。
2.怎么编译到ios呢,需要带ios版本编译插件的unity,
我这个就是可以编译到ios的unity,是我重新下载的,buildseting之后我可以选择ios那个选项,不可以选择的重新下载unity,一定要勾选ios,我现在有两个unity,一个是默认勾选,一个是只勾选了ios插件
3.我的VS2015是下载第一个unity的时候自带的社区版的VS,是免费的,但是需要登录,去微软官网创建一个微软的邮箱登陆上就可以了,我第一天登录的时候网不好,没登上,我又是翻墙,又是下载win10的,还是没登录上,第二天莫名其妙就登陆上了。。。。。。。
4.尺寸大家自己掌握吧 ,我的UI基本靠蒙。。。。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 第一人称射击网络游戏 的文章

 

随机推荐