Unity射击类游戏,僵尸猎手~

<p>
Unity射击类的游戏,写完后做一个总结记录,方便以后回顾。
</p>


一、游戏功能组成

游戏主要包括:主角(一个呆萌的baby),敌人(三种类型的僵尸),敌人生成管理,以及UI界面。

主要的功能有:
   主角,移动,射击僵尸,血量
   敌人,三种类型的僵尸,在场景生成后可以追踪主角,靠近主角后可以进行攻击。
   敌人生成管理,控制场景中三种僵尸的生成。
   UI界面,主角血量的显示,游戏开始以及结束。

二、游戏组件

每个游戏对象包括的组件有:

主角:
player

1.Animator 动画播放控制器,负责游戏中一些动画的控制;
2.Rigidbody 刚体,使主角可以受到物理力的控制,(游戏中使用到了刚体中的运动方法)
3.Capsule Collider 胶囊碰撞体,用来检测撞击的组件。

射击:
shoot

射击效果放在枪口上:
1.Light 射击时控制灯光的闪烁。
2.LineRenderer 射击时控制弹痕的射线。
3.AudioSource 射击时的音效

敌人:
Enemy

1.Animator 动画播放控制器,负责游戏中一些动画的控制;
2.Rigidbody 刚体,使主角可以受到物理力的控制,(游戏中使用到了刚体中的运动方法)
3.Capsule Collider 胶囊碰撞体,用来检测撞击的组件。
4.Nav Mesh Agent Unity自带的寻路系统,使用前需要对场景(场景需要设置为静态的)进行烘焙。
5.AudioSource 音频播放,用来控制游戏中的声音播放。(可以使用clip来播放不同的音频文件)
6.Sphere Collider 圆形碰撞体,用来做触发器,来检测主角是否在攻击范围内。使用时需要勾上istragger:


istragger
敌人生成管理:
Enemymanage

包括3个刷新点,分别刷新3种类型的僵尸,由脚本统一控制生成。

三、代码主要构成

主角,主要包括血量(BabyHp)、移动(BabyMove)以及射击Shoot(射击脚本是挂在枪口处)。
  敌人,主要包括血量(EnemyHp)、移动(EnemyWalk)以及攻(EnemyAtt)击。
  敌人生成管理(EnemyManage),包括3个刷新点,以及每个类型的敌人的刷新时间。
  相机跟随脚本(CameraFollow),挂载在Camera上,用来跟随主角移动。

四、注意要点

代码的逻辑都比较易懂,重点记录一下射线的使用,以及一些常用方法的应用:

1.插值运算

这种方法经常在一些渐变的过程,移动的平滑性中使用,这个游戏中,在主角收到攻击颜色变化,以及相机跟随主角移动,都使用到了插值运算,下面用相机跟随为例:


float smooth = 5;//控制相机跟随的平滑程度
//摄像机与玩家之间的间距
offsetPosition =  transform.position-playerTransform.position;
void FixedUpdate () {
//通过插值来控制摄像机跟随玩家移动Lerp(a,b,t);t取值为0-1,在Updata中调用时,越大越快的靠近b点。
 transform.position = Vector3.Lerp(transform.position,playerTransform.position+offsetPosition,Time.deltaTime*smooth);   
    }

2.射线检测

射线在游戏中两处用到了,一个是控制玩家的旋转,另外一个是射击。大致的使用步骤如下:
1.首先设置射线的长度:
2.获得地板层级:(floor)
3.取得射线(从摄像机打到屏幕鼠标位置。)
4.申明射线打到的点(这个值通过out参数来取得):
5.取得射线打到的位置:
Physics.Raycast(射线,射线打到的点(out修饰),射线长度,地板层级),返回的是一个bool类型的函数,通过if来判断得到碰撞点的位置信息。

//控制玩家旋转,在Updata中调用
private float rayLength = 100f;    //射线长度
int layer;    //射线碰撞的图层
RaycastHit rayHit;    //射线碰撞到图层的点位
Ray camareRay;    //声明射线
//取得摄像机和鼠标之间的一条射线
 camareRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        //判断这条射线和图层是否有碰撞,有的话通过rayHit取得点位置信息
        if (Physics.Raycast(camareRay,out rayHit,rayLength,layer))
        {
            Vector3 mousePosition = rayHit.point;
            mousePosition.y = 0;

            //transform控制旋转
            transform.LookAt(mousePosition);

            //刚体控制旋转,这个是通过四元数来控制
            //Quaternion lookAt = Quaternion.LookRotation(mousePosition);
            //playerRigid.MoveRotation(lookAt);
        }

//射线射击
//声明射线(枪口处),第一个参数是起始位置,第二个参数是方向
Ray ray = new Ray(transform.position, transform.forward);
//声明碰撞点
RaycastHit hitInfo;
        if(Physics.Raycast(ray,out hitInfo))
        {
        //碰撞上了物体,设置LineRenderer的终点为碰撞点
            lineRenderer.SetPosition(1, hitInfo.point);
        //判断碰撞上的是否是敌人
            if (hitInfo.collider.GetComponent<EnemyHp>() != null)
            {
                hitInfo.collider.GetComponent<EnemyHp>().Damage(attack,hitInfo.point);  
            }
        }
        else
        {
//如果没有碰撞上,则设置长度为100
   lineRenderer.SetPosition(1,transform.position+transform.forward*100);
        }
3.Invoke方法

这个方法在射击中使用,用来延时关闭射击的效果显示,有两个参数,第一个是调用的方法,第二个是延时时间。

    Invoke("ShootStop", 1.2f*Time.deltaTime);
    void ShootStop()
    {
        light.enabled = false;
        lineRenderer.enabled = false;
    }
}
4.敌人消失注意项

敌人在被打死后会自动下沉,完成到这里时需要注意,下沉的同时也要把自动追踪的组件(NavMeshAgent)给disable掉,不然不会下沉消失。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容