unity3d射击游戏毕业论文_unity3d向前方射击nity3d射击游戏教程 - CSDN
  • 今天和·1昨天学习了《第一人称射击游戏》 现在来做一个总结: 首先是对周围墙体、地面加上一个碰撞检测体:Msh Collider(主要作用就是为了是其他物体gameobject对象无穿越它) 再在上面加一个Navigation...

    今天和·1昨天学习了《第一人称射击游戏》

    现在来做一个总结:


    首先是对周围墙体、地面加上一个碰撞检测体:Msh Collider(主要作用就是为了是其他物体gameobject对象无穿越它)

    再在上面加一个Navigation组件,起作用是:给地面添加一个自动寻找路径的基本设置设置,


    对于主角Player来说,

    显示创建一个empty gameobjec,

    再绑定一个character controller组件,(产生物理效果模拟)

    绑定一个Rigidbody组件(刚体组件),游戏对象只有绑定了刚体组件才可以产生碰撞效果

    主角Player对象绑定的Player.cs主要有这么几个成员变量:

    m_transform(得到自身的transform)

    m_ch(得到绑定在自身的character controller)

    m_movespeed(主角的移动速度)

    m_gravity(主角的重力感应模拟值)

    m_life(主角的生命值)

    m_camTransform(用来绑定摄像机,得到摄像机的transform)

    m_camRot(摄像机跟随主角转动时的角度转移变量值)

    m_zzlepoint(枪支weapon的子弹射线发出点)

    m_layer(射线射出时,可以碰撞的layer层)

    m_fx(子弹射出效果prefab)

    m_audio(子弹射出音效)

    m_shootTimer(子弹射出时间间隔)

    -------------------------------------------------

    初始化,start()函数:

    初始化m_transform,m_ch,m_carTransform,

    并将其绑定在一起,

    --------------------------------------------------

    更新Update()函数:

    move()函数-----通过按键进行主角的移动

    鼠标->m_camRot->改变m_camTransform.position/eulerAngles.即通过移动鼠标可以控制摄像机的转动

    射击(条件、音效、setAmmo()、发出射线、打伤敌人、释放特效prefab(特效绑定AutoDestroy())、)


    ==================================================================

    ==================================================================

    接下来就是敌人Enemy:

    对敌人组件添Nav Mesh Agent组件,(用来自动寻找路径)

    对于敌人Enemy的脚本Enemy,cs有:

    m_transform(获取自身transform)

    m_player(获取主角对象的Player脚本)

    m_agnet(自动寻路组件)

    m_moveSpeed(敌人的移动速度)

    m_ani(敌人的动画控制组件)

    m_rotspeed(敌人的围绕主角的旋转速度)

    m_timer(敌人的发呆idle时间)

    m_life(敌人的生命值)

    m_spawn(Enemy产生器)

    ------------------------------------------------------------

    初始化start()函数:

    获取m_transform,

    获取m_player,

    获取m_agent

    设置寻路目标m_agent.setDestination()

    获取动画组件m_ani;

    ------------------------------------------------------------

    Update()更新函数:

    m_agent.Move()寻找敌人

    stateInfo函数((((((

    1、发呆idle状态:发完呆,如果离主角距离小于1.5m就进入攻击动画,如果大于1.5米,进入奔跑run()状态

    2、奔跑状态run():每隔m_timer时间就重新进行判定一次,如果与主角距离小于1.5m,就进入攻击动画;大于1.5m就跟新寻路路径,继续奔跑追踪主角

    3、attack()状态,如果在attack()状态时间超过1s,就可以干给主角一枪(伤害主角一次),同时进入发呆idle状态,再次进入下一轮回的判定,时间不足就没办法

    )))))))))))

    其他可供调用函数:

    OnDamage()函数:主角伤害时调用,减少自己的生命值

    Init()函数:初始化,在产生这个Enemy对象时就初始化好,用于对应于Spawn的EnemyCount,

    OnDeath()函数:当生命值<=0时,进入动画death状态,减少Spawn的·EnemyCount值,增加GameManager分数,


    ============================================================

    ===========================================================

    现在轮到UI,GameManeger,

    hierarchy ||     script变量

    heath ||  m_player

    hud ||    txt_ammo(GUIText)

    txt_hiscore ||  m_hiscore txt_life(GUIText)

    txt_ammo ||  m_ammo  txt_hiscore(GUIText)

    txt_score ||  m_score txt_score(GUIText)

    weapon ||

    -------------------------------------

    Update()更新函数:

    Setcore()更新分数

    SetAmmo()更新子弹数量

    SetLife()更新生命值


    =================================================

    好了,现在就是敌人产生器EnemySpawn的设置:

    m_enemy(关联Enemy.prefab)

    m_enemyCount(敌人产生数量)

    m_maxEnemy(敌人最大数目)

    m_timer(随机的敌人产生时间间隔)

    m_transform(获取EnemySpawn的transform)




    展开全文
  • 当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪;2: 导入碎片模型;3: 创建一个平面;4: 创建一个障碍物;5: 导入人物模型;6: 配置一个十字瞄准器, 设想机对准的中心就是瞄准...

    当前Unity最新版本5.6.3f1,我使用的是5.5.1f1

     

     

    场景搭建

    1: 导入人物模型, 手持一把枪;
    2: 导入碎片模型;
    3: 创建一个平面;
    4: 创建一个障碍物;
    5: 导入人物模型;
    6: 配置一个十字瞄准器, 设想机对准的中心就是瞄准的中心, 屏幕中心;
    7: 配置一个第一人称的摄像机,做人的眼睛;

     

     

    开枪射击

    1: 鼠标左键按下开火;
    2: 从摄像机位置开始,根据摄像机的正前方,在一定的射击距离内如果碰撞到了某个物体,那么就表示这个物体被子弹射击;
    3: 播放射击的子弹碎片: 在射击碰撞点产生碎片物体,并给这些碎片物体一个反弹力(100)
    方向是设计的反方向;
    4: Physics.Raycast (起点, 发射方向向量, out hit, 最大有效距离(子弹的距离));
    5: 播放开枪的声音
     PlayOneShot 固定时间播完你的audio文件; 
     用PlayOneShot,就能够听到连续的枪声了;

     

     

    人物的行走

    1: 定义移动的速度;
    2: 玩家在自己的坐标空间内向前(W),后(S), 左(A), 右(D);
    3: 前后 Translate(0, 0, 距离, Space.Self);
    4: 左右 Translate(距离, 0, 0, Space.Self);
    5: 播放人物行走的脚步声;

     

     

    枪的上下左右移动

    1: 枪的左右瞄准;
     (1)计算绕Y轴旋转的欧拉角 GetAxis(Mouse Y) * 移动的灵敏度(5);
     (2)在转向的时候,角色也要跟着转,那么我们旋转角色就可以了, 摄像机也会跟着转;
      修改角色的欧拉角;
     (3) 给这个枪绕Y轴一个转动范围[-360, 360]
     (4) Mathf.Clamp(value, min, max);
    2: 枪的上下移动: localEulerAngles
     (1)枪的上下移动,角色不动,所以不能作用到角色上;
     (2)计算绕X轴旋转的欧拉角 GetAxis(Mouse X) * 移动的灵敏度(5);
     (3)只作用在瞄准上(eye),所以修改摄像机的相对欧拉角;
     (4)同时手中的枪也要移动对应的欧拉角(right hand);
     (5)抬头低头有一个范围,我们在[-45, 45]的范围内;

     

     

    FPS第一人称射击类游戏实例

    场景搭建

    1.创建Unity项目工程和文件目录,保存场景

    2.导入人物模型和子弹碎片的资源包charactor.unitypackage(第74)

    3.创建一个平面plane,X和Z拉长10倍,把主角模型Assets\Prefabs\person拉近Hierarchy视图中

    4.把走路的声音Step.mp3,射击的声音Shot.mp3,平面贴图Ground.jpg,瞄准的准心贴图Crosshairs.png(第74)导入Resources文件夹

    5.把Crosshairs.png直接拖进Scene视图的平面plane上,自动帮我们生成了平面的材质并关联

    6.创建一个cube,放大4倍,放在主角模型的正前方,Z设置为20

    7.配置一个十字瞄准器,UI和摄像机是成比例对应的,所以摄像机对准的中心就是等下Crosshairs瞄准的中心,屏幕中心,右键---->UI---->Image,命名为Crosshairs,再把Crosshairs.png的Texture Type设置为Sprite(2D and UI)

    8.把Crosshairs.png拖进Crosshairs节点的Image组件的Source Image属性中,调整Crosshairs的position为(0,0,0),屏幕正中央,Set Native Size

    9.配置一个第一人称的摄像机,做人的眼睛。就是把Main Camera拖到person下作为子节点重命名为eye,这样可以跟随主角移动。然后把摄像机的position设置为(0,1.5,0),正好在人物头部

     

    开始射击

    10.创建一个脚本open_fire,挂载在person节点下,里面实现开枪的逻辑。

     a.查看虚拟按键Edit---->Project Settings---->Input---->Fire1---->mouse 0,可以用Fire1代替mouse 0

     

     b.枪口喷火的特效如果喷的很分散的话,可以设置FireEffect---->Particle System---->Shape---->Shape---->类型设置为Mesh

     c.FPS游戏通常不会有真的子弹在天空中飞来飞去的,一般是用射线实现,有真的子弹也没关系。

     打开open_fire.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class open_fire : MonoBehaviour {
        private ParticleSystem fire_effect;//特效节点person---->RightHand---->FireEffect
        public Transform eye;//摄像机节点person---->eye
        public GameObject piece;//碎片节点Prefabs文件夹---->piece
        //开枪的声音Resources文件夹---->Shot,给person节点加一个AudioSource组件,关联Shot,再把person节点拖进shoot_audio
        //AudioSource组件的Play On Awake打钩去掉
        public AudioSource shoot_audio;
        
    
        // Use this for initialization
        void Start () {
            //获得开枪的特效节点的特效组件
            this.fire_effect = this.transform.Find("RightHand/Pistol/FireEffect").GetComponent<ParticleSystem>();
        }
       
        //生成枪打到障碍物的碎片特效
        void play_pieces_effect(Vector3 w_pos) {
            for (int i = 0; i < 5; i++) {
                GameObject p = GameObject.Instantiate(this.piece);
                p.transform.position = w_pos;//坐标设置在碰撞点处
                p.GetComponent<Rigidbody>().AddForce(-this.eye.forward * 100f);//撞到后给一个反弹力,方向和摄像机Z轴方向相反
    
    
                // Component.Destroy(p, 0.3f);//在0.3s后删除该组件
                // MonoBehaviour.Destroy(p, 0.3f);//在0.3s后删除该组件,MonoBehaviour继承自Component
                //Destroy(p, 0.3f);//在0.3s后删除节点,调用静态函数Destroy
                GameObject.Destroy(p, 0.3f);//在0.3s后删除节点
            }
        }
    
        //枪发射子弹
        void shoot_fire() {
            // 播放枪发射子弹时枪口的火焰
            this.fire_effect.Play();
            // end 
    
            // 播放开枪的声音
            // this.shoot_audio.Play();//用这个播的比较慢,因为shot声音前面一小段没声音
            this.shoot_audio.PlayOneShot(this.shoot_audio.clip);//用这个播的速度比较快,固定时间内播完
            // end 
    
            // 当前这个枪打到了哪个物体
            // 从这个eye的位置,沿着eye的前方方向,发射一条射线,看谁被命中了
            // 子弹是有有效的射击距离的,所以,我们要传入子弹的最大距离
            RaycastHit hit; // 命中的对象
            //从this.eye.position出发,向this.eye.forward(Z轴方向)发射一条射线,撞到hit,射线最大距离100米,最后再out带出hit命中对象
            if (Physics.Raycast(this.eye.position, this.eye.forward, out hit, 100))
            {
                // 枪打到了哪个障碍物,打印出障碍物的碰撞器的节点的名字
                Debug.Log(hit.collider.gameObject.name);
                // .....其他的游戏逻辑
                // end 
    
                // 播放这个碎片特效,传入碰撞点世界坐标hit.point
                this.play_pieces_effect(hit.point);
                // end 
            }
            // end 
        }
        // Update is called once per frame
        void Update () {
            //鼠标左键按下,在Edit---->Project Settings---->Input里面有配置Fire1就是鼠标左键mouse 0
            if (Input.GetButtonDown("Fire1")) {
                this.shoot_fire();
            }
        }
    }

      

     

    人物的行走

    11.创建一个脚本fps_ctrl,挂载在person节点下,里面实现控制人物行走的逻辑。

     a.因为第10步的时候,person已经挂载了一个AudioSource组件,里面放的是开枪的声音,所以我们如果要再加一个AudioSource组件,放走路的声音,会导致随机选取两个声音之中的一个声音调用

      解决方法是,可以在person的子节点下面挂载一个AudioSource组件,关联走路的声音,这样节点不同,关联的AudioSource组件也不同

     打开fps_ctrl.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class fps_ctrl : MonoBehaviour {
        public float move_speed = 8.0f;//定义人物移动的速度
        //开枪的声音Resources文件夹---->Step,给person的子节点加一个AudioSource组件,关联Step,再把person的这个子节点拖进walk_audio
        //AudioSource组件的Play On Awake打钩去掉
        public AudioSource walk_audio = null;
    
        // Use this for initialization
        void Start () {
            
        }
    
        // 单独分支出一个update函数用来做移动,W(上)S(下)A(左)D(右)
        bool walk_update() {
            if (Input.GetKey(KeyCode.W)){//GetKey一直按下,一直触发,GetKeyDown是按下再弹起来一次,触发一次
                float distance = this.move_speed * Time.deltaTime;//1秒移动的距离
                this.transform.Translate(0, 0, distance, Space.Self);//沿着自己的空间,也就是本地坐标移动,不是世界坐标
                return true;
            }
            if (Input.GetKey(KeyCode.S)) {
                float distance = this.move_speed * Time.deltaTime;
                this.transform.Translate(0, 0, -distance, Space.Self);
                return true;
            }
            if (Input.GetKey(KeyCode.A)) {
                float distance = this.move_speed * Time.deltaTime;
                this.transform.Translate(-distance, 0, 0, Space.Self);
                return true;
            }
            if (Input.GetKey(KeyCode.D)) {
                float distance = this.move_speed * Time.deltaTime;
                this.transform.Translate(distance, 0, 0, Space.Self);
                return true;
            }
            return false;
        }
    
    
        // Update is called once per frame
        void Update () {
            // 如果有移动,就播放行走的声音
            if (this.walk_update()) {
                if (!this.walk_audio.isPlaying) {//正在播放就不要再播了,减少调用
                    this.walk_audio.Play();//不是正在播放就播一下
                }
            }
        }
    }

     

    枪的上下左右移动

    12.打开脚本fps_ctrl,写好枪的上下左右移动的逻辑,就是鼠标转动的时候,摄像机也会跟着转动,整个画面就跟着转动

     a.限制值的范围的函数Mathf.Clamp(value, min, max);

     b.父节点控制世界的欧拉角的时候,子节点控制本地的欧拉角,让引擎帮我们把本地转换为世界,不会乱

     打开脚本fps_ctrl

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class fps_ctrl : MonoBehaviour {
        public float move_speed = 8.0f;//定义人物移动的速度
        //开枪的声音Resources文件夹---->Step,给person的子节点加一个AudioSource组件,关联Step,再把person的这个子节点拖进walk_audio
        //AudioSource组件的Play On Awake打钩去掉
        public AudioSource walk_audio = null;
    
        float rot_y = 0.0f;//绕主角自身y轴总共旋转了多少
        float rot_x = 0.0f;//绕主角自身x轴总共旋转了多少
        public Transform eye = null;//获得摄像机节点
        public Transform right_hand = null;//握枪的手的节点
    
        public float sensibility = 5.0f; //灵敏度,鼠标移动多少像素和旋转转动多少角度的单位比例
        // Use this for initialization
        void Start () {
            
        }
    
        // 单独分支出一个update函数用来做移动,W(上)S(下)A(左)D(右)
        bool walk_update() {
            if (Input.GetKey(KeyCode.W)){//GetKey一直按下,一直触发,GetKeyDown是按下再弹起来一次,触发一次
                float distance = this.move_speed * Time.deltaTime;//1秒移动的距离
                this.transform.Translate(0, 0, distance, Space.Self);//沿着自己的空间,也就是本地坐标移动,不是世界坐标
                return true;
            }
            if (Input.GetKey(KeyCode.S)) {
                float distance = this.move_speed * Time.deltaTime;
                this.transform.Translate(0, 0, -distance, Space.Self);
                return true;
            }
            if (Input.GetKey(KeyCode.A)) {
                float distance = this.move_speed * Time.deltaTime;
                this.transform.Translate(-distance, 0, 0, Space.Self);
                return true;
            }
            if (Input.GetKey(KeyCode.D)) {
                float distance = this.move_speed * Time.deltaTime;
                this.transform.Translate(distance, 0, 0, Space.Self);
                return true;
            }
            return false;
        }
    
        // 单独分支出一个update函数用来做枪的上下左右转动
        void look_update() {
            // 左右移动,主角绕自身Y轴左右旋转,在Edit---->Project Settings---->Input里面有配置Mouse X,鼠标在屏幕的X轴上移动的量
            //两者相乘获得一个旋转的角度
            this.rot_y += (Input.GetAxis("Mouse X") * sensibility);
            // 给这个旋转一个范围[-360, 360],之间的用this.rot_y,小于-360返回-360,超过360返回360
            this.rot_y = Mathf.Clamp(this.rot_y, -360, 360);
            //获得当前节点世界的欧拉角
            Vector3 e_rot = this.transform.eulerAngles;
            //设置当前节点的欧拉角的y为我们变化后的y
            e_rot.y = this.rot_y;
            //赋值给原欧拉角
            this.transform.eulerAngles = e_rot;
            // end 
    
    
    
            // 上下旋转, 摄像机绕自身X轴上下旋转,在Edit---->Project Settings---->Input里面有配置Mouse Y,鼠标在屏幕的Y轴上移动的量
            //往上抬时旋转的角度为负,这样旋转的时候是逆时针,这样摄像机就向上抬
            this.rot_x -= (Input.GetAxis("Mouse Y") * sensibility);
            //范围[-45, 45],之间的用this.rot_y,小于-45返回-45,超过45返回45
            this.rot_x = Mathf.Clamp(this.rot_x, -45, 45);
            //获得摄像机节点的本地的欧拉角,因为它是person的子节点,左右移动时person已经控制了世界的欧拉角,这里只能控制本地欧拉角
            //如果用世界的欧拉角还要叠加父亲的欧拉角的旋转,我认为用世界坐标会导致减去父节点的世界坐标后得到的原来的本地坐标乱了
            //用本地的欧拉角,让引擎帮我们转成世界的欧拉角,不会乱
            e_rot = this.eye.localEulerAngles;
            //设置当前节点的欧拉角的x为我们变化后的x
            e_rot.x = this.rot_x;
            //赋值给原欧拉角
            this.eye.localEulerAngles = e_rot;
            // end 
    
            //握枪的手也要跟着摄像机转动
            e_rot = this.right_hand.localEulerAngles;
            e_rot.x = this.rot_x;
            this.right_hand.localEulerAngles = e_rot;
            // end
        }
    
        // Update is called once per frame
        void Update () {
            // 如果有移动,就播放行走的声音
            if (this.walk_update()) {
                if (!this.walk_audio.isPlaying) {//正在播放就不要再播了,减少调用
                    this.walk_audio.Play();//不是正在播放就播一下
                }
            }
    
            this.look_update();
        }
    }

     

    13.最终效果

     

    转载于:https://www.cnblogs.com/HangZhe/p/7401106.html

    展开全文
  • Unity3D中基于有限状态机的人工智能基于有限状态机的人工智能有限状态机分层有限状态机         若游戏中不仅有玩家控制的Object,也有电脑控制的Object(通过电脑控制场景中物体的自由运动)...



            若游戏中不仅有玩家控制的Object,也有电脑控制的Object(通过电脑控制场景中物体的自由运动),此时便涉及到人工智能。人工智能常用的算法有很多,包括有限状态机、模糊逻辑、决策树、专家系统、神经网络和遗传等,更涉及到大数据和机器学习等领域。游戏中的人工智能设计遵循着一定的规律。

    基于有限状态机的人工智能

    有限状态机

          有限状态机是指有限个状态以及在这些状态之间转移和动作的数学模型,现在以一个游戏场景为例,假定电脑操作的Object(此处以坦克为例)会有以下行为。
    1. 坦克会在场景中巡逻
    2. 若坦克发现敌人。则靠近敌人并向敌人射击。
    3. 若hp(生命值)降低到一定程度,则设法逃跑。

           根据上述行为,可以设计如图所示的状态装转换图。坦克有逻辑、进攻和逃跑三种状态,在逻辑状态下,如果发现了敌人(敌人出现在坦克的视角范围内)则会变成进攻状态;在进攻状态下,如果丢失了目标(目标被摧毁或离开视角范围)则会回到巡逻状态;交战过程中,如果坦克的hp(生命值)小于指定值,则逃跑,直到远离目标继续巡逻。

    在这里插入图片描述

            如果不考虑设计模式,状态机可以简单地用ifelse语句来实现。有限状态机的特点是输出(转换的状态)只由当前状态和输入(满足的条件)来确定,有着明显的逻辑关系,代码结构如下:

     void Update()
        {
            target = 搜寻目标();
            if (坦克状态 == 巡逻)
            {
                if (target != null)
                    坦克状态 = 进攻;
                else
                    处理巡逻状态();
            }
            else if (坦克状态 == 进攻)
            {
                if (target == null)
                    坦克状态 = 巡逻;
                else if (tank.hp < 30) 坦克状态 = 逃跑;
                else 处理进攻状态();
            }
            else if(坦克状态 == 逃跑)
            {
                if (target == null || 远离(target))
                    坦克状态 = 巡逻;
                else
                    处理逃跑状态();
            }
        }
    

    分层有限状态机

         上述状态机定义了坦克巡逻、进攻和逃跑三项策略,并规定了切换策略的条件。然而状态机并没有告诉坦克在各种状态下应该做什么事情,比如:巡逻状态下怎样走到指定的位置,进攻状态下又该怎样靠近敌人,炮塔如何瞄准对手等,这便涉及了第二层状态机。以进攻以进攻状态为例,坦克要处理移动和开炮两件事情。

    1. 移动到敌人面前
    2. 炮塔对准敌人并适时开炮。
      单看“移动”这一项,至少会涉及“未到达目的地”和“到达目的地”两种状态。若坦克处于“未到达”状态,它将继续前进,直到靠近目的地切换为“到达目的地”状态为止。“开炮”一项也至少会涉及“未对准”和“对准”两种状态,如果坦克处于“未对准”状态,炮塔将朝着敌人方向旋转,直到对准敌人切换为“对准状态”为止;若为“对准状态”,它将不断发射炮弹。当敌人的位置发生变化时,坦克将再次切换为“未对准状态”。下图展示了进攻状态下的第二层状态机。

    在这里插入图片描述

         如同进攻状态,巡逻和逃跑也对应着“炮塔状态机”和“移动状态机”两种情形(见下图)。每一层状态机相互独立,负责自己的功能。例如,当坦克处于进攻状态时,“处理进攻状态的方法”只需要告知“移动状态机”目的地的坐标即可,至于怎样移动到目的地则由“移动状态机”全权负责。

    在这里插入图片描述
         基于上述的两层状态机,就可以实现简单的敌人AI了。

    展开全文
  • 一个正在实习的大四狗,在深圳飘荡数日,终于在一家小型游戏公司,找到实习的机会,实习并不是我想象的那么简单,以前以为实习这东西很简单,结果一到公司就塞给我一个开发到后期的小游戏代码,叫我一个礼拜熟悉一下...

          一个正在实习的大四狗,在深圳飘荡数日,终于在一家小型游戏公司,找到实习的机会,实习并不是我想象的那么简单,以前以为实习这东西很简单,结果一到公司就塞给我一个开发到后期的小游戏代码,叫我一个礼拜熟悉一下,里面用到了网络协议,AssetBundle,lua编程,都是我以前写小demo过程中没有接触过的,真心觉得我会被老板给踢掉。看了三天,嫩是没看明白,平时写的代码太少,C#基础不牢固,这下全部暴露了。怎么办呢。。又不能直接看基础的,研发总管说跟项目做更快,只好厚着头皮去做了,以上是这篇博客的背景。

         怎么办,只好从最基础的UI搞起来,assetbundle管理资源,跟着siki看视频,老板不是我不看源码,是我真的看得太吃力啦。持续更新我的菜鸟生涯。

          更新一下吧,现在已经从公司离职了,最开始进公司的时候,我看了大概三,四天的项目源码,这种祖传代码,没有备注,看起来很费劲。然后开始修改一下游戏中一些UI,就是UI搬运工。用带我的工程师的一句话来说“这个不就几行代码,你怎么花了一天的时间”我只能尴尬的一笑。为了早日熟悉业务工程,我也是每天加班到公司最后一个走(其实也就是九点左右,公司人就走完了)。改了几天的UI,这时候游戏需要申请版本号,这时候分配给我出个申版号的包,就是把该隐藏的隐藏,为了符合社会主义价值观。游戏的文字表达都改了一波,“复仇”改成“反攻”,“偷取”改成“夺富”。

           出完申版号包后,为了提升游戏的整体性能,我跟着带我的大佬一起更换框架,疯狂搬运代码,框架很多地方不懂,所以搬个大功能也花了一个礼拜(其实只是为了和公司其他游戏用同一个框架,便于管理)。我们两个人花了一个月的时间,终于把框架换完了,我的工作估计只有百分之10。搞完了之后我快在公司呆了两个月啦,为了成功毕业,五月份一开始就溜回学校啦,请了20几天。回学校天天修改自己的毕业设计,和修改论文。由于我的导师的帮助,论文申请了优秀论文,也过了。在学校的一个月的时间也是过得飞快。转眼我又回到公司上班啦。回来带我的大佬到了另一个项目组,我成了我负责的游戏唯一的客户端程序员。回来先改了两个礼拜的BUG,之后也就一直没什么事,本来一直说接第三方SDK,我学了一段时间,结果服务端一直在忙另外一个项目。我也就只好去重构一下游戏中的功能,之前一直修改代码,不敲代码真的不行,搞得特别生疏。花了两个礼拜把其中一个有趣点的游戏功能重构了一下。同时在一直等着服务端大佬完成其他的工作,把第三方SDK在服务端的接口做好给我,我再把SDK连接好,先上电视平台。

          没想到服务端大佬,申请了辞职。周末请比较熟悉同事一起吃了个饭。卧槽,我该怎么办。这个接下去,我该做什么工作呢。我当时问了这个大佬,他告诉我我负责的这个项目公司不重视,他们(项目主管)说什么就做什么吧,叫我可以找新来的服务端大佬交接,尽快推上线就行。

           服务端大佬走了两天后,我去上班和人事谈转正的事宜,转正工资我不满意(没上税)。他们也没有说什么可以谈的意思。我也就溜之大吉啦。本以为我有了三个月的实习经历,找个工作应该不难吧。我没想明白什么是毕业季。BOSS找了许多,公司大部分都要直接能够上手负责项目的。

            

     

     

     

     

     

    展开全文
  • 双击Unity,选择New Project:我们将它命名为rts,悬着其他本地磁盘例如C:,选择3D然后点击Create Project: 然后我们通过File->Save Scene,保存当前的场景为“scene”(不需要“”) 摄像机 Unity会自动添加相机...
  • 大学毕设经历   以前其实还没听说过本科毕设有多难,研究生和博士生到是知道难度有些...  我的毕设是做个游戏APP,起初我本来选题是连连看APP游戏设计,但是后来遇到一点事情说题目重复了要求更换,于是我在4月...
  • 课设题目 基于SpringBoot的用户音乐平台 家装设计公司客户关系系统 基于机器学习的文本语义分析工具 基于微信小程序的私教预约系统 ... 标准化轮胎仓库管理系统 ... 公务机典型试飞科目数据...
  • 自从3月离开360之后,已经很久没有出现在国内游戏圈里了,因为选择了在一家香港上市的游戏公司工作,这段时间一直在海外市场到处看,也花了不少时间思考整个游戏行业的发展历史和未来趋势,对比中国游戏市场和海外...
  • 基于NLP,ASR及TTS技术的智能语音分析工具-负责语义分析部分(论文替代) 基于SpringBoot的用户音乐平台 家装设计公司客户关系系统 基于机器学习的文本语义分析工具 基于微信小程序的私教预约系统 标准化轮胎...
  • Unity3d开发VR第一讲---概述 http://www.docin.com/p-1444636517.html Unity对某些虚拟现实设备提供了内置支持。 Unity从5.3版本开始专注于虚拟现实Oculus家族设备,特别是Oculus Rift Development Kit 2(DK2)和...
  • 毕业学长设计

    2020-02-17 09:38:50
    已经毕业两年多了,可以帮学弟学妹们无偿帮做设计,给点奶茶费就行了哈哈。如果想自己做的话,可以看我另一篇博文,那里有我开发的一键生成设计的系统。 一键生成毕业设计 ------------------------------------...
  • 课题名称 备注 基于XML的图形构件编辑器的设计与... 基于UE4/Unity的解谜类游戏开发 支持安全通信的嵌入式通信中间件的设计与开发 基于Android的企业行政管理APP的设计与实现 基于cocos2d+...
  • PS:题猪分得清游戏游戏引擎的区别,所以各位答主不需要劳神解释两者的区别关系什么的了 PS:这里的游戏引擎暂时指图形模块,其他的声音,物理,网络,UI等等模块暂时不考虑 题猪一直自学编程,有c++、数据...
  • 下载地址 最后更新共计113个分类5177套源码...│ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签的灵活运用.rar │ │ Android 实现 标签 拖动 改变位置.rar │ │ android 流式布局和热门标签.zip │ │ ...
  • 《虚拟现实应用技术》 《虚拟现实应用技术》 版本 作者 参与者 完成日期 备注 YanlzVR_Tech_V01_1.0 严立钻 ......
  • 大学英语四级单词

    2011-12-07 08:56:01
    a [Ai, 4, 1n, 4n] art.一(个);任何一(个);每一(个) abandon [4'b1nd4n] vt.离弃,丢弃;遗弃,抛弃;放弃 ability [4'biliti] n.能力,本领;...able ['Aib4l] a....aboard [4'b3:d] prep....about [4'b2ut
1
收藏数 15
精华内容 6
关键字:

unity3d射击游戏毕业论文