Survival Shooter Tutorial 笔记

  • Survival Shooter Tutorial 是Unity官方提供的一个3D生存类游戏的一个资源包,里面包含了做一个简单3D射击游戏的通常所需要使用到的功能代码以及资源,也可以了解到资源的一些调整和设置,总体来说是一个对于没有做过3D游戏的初学者来说是一个很不错的资源,并且代码注释也比较完整,理解难度也不高。
  • 适用Unity版本:4.7.1
  • 资源下载界面

花了点时间看了下这个资源,理解起来并不难,也是刚开始学习3D游戏的制作,以前都是2D,记录下在这个资源包中所了解到的一些关于3D或者2D的知识点。其实现在随着Unity的发展,很多的要实现的功能已经被封装成了各式各样的接口,调用起来也很方便,但是,这些接口背后所做的工作或是其他的一些数学物理基础和概念,如果了解的话更容易理解这个接口的实现原理和为什么这样去实现。

主要记录一些脚本方面的笔记。

脚本部分主要接触资源包脚本代码的片段进行各个脚本想要记录的知识点,需要注意的是资源包导入到工程中是有如果有两份同名代码的时候,需要记得区别游戏运行的是哪个地址的脚本,否则打印调试的时候可能出现没有反应的情况。

CameraFollow.cs

这个脚本主要实现了摄像头跟随游戏主角移动的功能。

        void FixedUpdate ()
        {
            // Create a postion the camera is aiming for based on the offset from the target.
            // 刷新相机当前应该所在位置
            Vector3 targetCamPos = target.position + offset;

            // Smoothly interpolate between the camera's current position and it's target position.
            // 平滑移动相机的位置(当前位置,目标位置,移动速度)
            transform.position = Vector3.Lerp (transform.position, targetCamPos, smoothing * Time.deltaTime);
        }

Note

  • FixedUpdate:这个方法将按照固定的帧率被调用,通常用来处理跟RigidBody,或者物理引擎相关的物体运动等方面的操作。
  • Vector3.Lerp:用作两个坐标点之间的线性插值,通过不断的修改坐标值,获得一个相对于平滑的物体移动轨迹,第三个参数值越大,移动速度越快。2D环境下可以使用Vector2.Lerp。
EnemyManager.cs

这个脚本负责了怪物的创建,主要是调用循环执行在规定的时间周期内重复调用创建敌人。所有怪物的创建都通过该脚本,只是创建的怪物不一样而已。

    // Call the Spawn function after a delay of the spawnTime and then continue to call after the same amount of time.
    // 间隔时间执行
    InvokeRepeating ("Spawn", spawnTime, spawnTime);
    // Find a random index between zero and one less than the number of spawn points.
    // 随机选择出生地点
    int spawnPointIndex = Random.Range (0, spawnPoints.Length);

Note

  • InvokeRepeating("执行方法名", 延后执行时间, 周期时间)
  • Random.Range(下限, 上限),结果包含下限不包含上限

GameOverManager.cs

这个脚本主要负责的是玩家控制游戏的角色死亡之后的代码逻辑。

    // ... tell the animator the game is over.
    // 播放游戏结束动画
    anim.SetTrigger ("GameOver");

Note

  • Animator.SetTrigger("状态名") 方法是用作从当前动画状态切换到目标动画状态,跟bool的区别是bool需要手动去设置bool的值是True还是False,而SetTrigger则自动回复状态,如果说setBool是两个状态的来回切换的话,SetTrigger就是点一次触发一次到目标状态。SetTrigger也可以从自身状态转到自身状态,在Transition的Sitting中设置。

PauseManager.cs
这个脚本主要是停止游戏时间然后切换游戏音乐状态

    Time.timeScale = Time.timeScale == 0 ? 1 : 0;
    void Lowpass()
    {
        if (Time.timeScale == 0)
        {
            paused.TransitionTo(.01f);
        }
        
        else
            
        {
            unpaused.TransitionTo(.01f);
        }
    }

Note

  • Time.scale,用来调整依赖于时间进行的一系列物理运动,这是所指的时间并不是现实时间而是Unity中的时间概念,通常会影响FixedUpdate的调用频率而不影响Update和LateUpdate。
  • AudioMixerSnapshot.TransitionTo(),在指定的时间间隔内对此快照执行插值转换。暂时还不是很理解。(待解决)有兴趣再挖一下。

EnemyAttack.cs
这个脚本主要判断是否接触了玩家,如果是的话则开始攻击也就是扣血。

Note

  • void OnTriggerEnter (Collider other)
  • void OnTriggerExit(Collider other)
  • void OnTriggerStay(Collider other)
  • 这三个触发器方法仅当碰撞体使用Trigger作为输入的时候才有效也就是碰撞体上面的isTrigger

EnemyHealth.cs
这个脚本主要控制怪物的存亡和受到攻击播放例子特效。

        // Turn the collider into a trigger so shots can pass through it.
        // 修改碰撞体isTrigger,使其被物理引擎忽略,从而让子弹穿过,也使得可以穿过碰撞体
            capsuleCollider.isTrigger = true;

Note

  • 当碰撞体上的IsTrigger被设置为True,那么该物体就会不受到物理引擎的影响,从可以可以穿过其他碰撞体。这里是为了可以让怪物死后下沉以及让射击穿过已经死亡的怪物。

EnemyMovement.cs
这个脚本主要控制怪物的朝向以及向玩家寻路靠近。

    Update()
    {
        // ... set the destination of the nav mesh agent to the player.
        // 使用Unity AI自动寻路
        nav.SetDestination (player.position);
    }

Note

  • UnityEngine.AI.NavMeshAgent.setSetDestination(),提供了将绑定的物体寻路到固定坐标的方法,通过Update逐帧调用,从而不断刷新寻路坐标而逐渐靠近目标坐标或者物体。

PlayerMovement.cs
这个脚本主要负责响应玩家的输入,对控制的角色进行移动以及瞄准方向的改变。

        // Create a layer mask for the floor layer.
        // 得到的值是2的需要获取的Layer的次方,用于模拟射线忽略其他的碰撞体
        floorMask = LayerMask.GetMask ("Floor");
        void Move (float h, float v)
        {
            // Set the movement vector based on the axis input.
            // 设置方向
            movement.Set (h, 0f, v);
            // 归一化方向向量,乘以速度和时间获得移动距离
            // Normalise the movement vector and make it proportional to the speed per second.
            movement = movement.normalized * speed * Time.deltaTime;

            // Move the player to it's current position plus the movement.
            // 移动物体到新的坐标,使用刚体的movePostion更自然流畅
            playerRigidbody.MovePosition (transform.position + movement);
        }
        if(Physics.Raycast (camRay, out floorHit, camRayLength, floorMask))

Note

  • 通过LayerMask.GetMask()获得的Layer ID是Int 32位的二进制形式保存的,这也是为什么一共只有32个Layer可以设置,获得的值也是2的幂次方。
  • 使用RigidBody.MovePosition会比直接设置Transform的坐标更流畅自然。
  • 模拟射线时传入Layer的ID就可以模拟射线的时候忽略其他层的影响。

PlayerHealth.cs
这个脚本控制玩家的血量,判断玩家是否游戏结束。

        // ... transition the colour back to clear.
        // 从红色到透明
        damageImage.color = Color.Lerp (damageImage.color, Color.clear, flashSpeed * Time.deltaTime);

Note

  • Color.Lerp用来做颜色的插值过渡。

PlayerShooting.cs
这个脚本主要负责玩家射击功能,射线模拟,确认击中的坐标,通知怪物播放受击例子特效和扣血。

Input.GetButton ("Fire1")
gunLine.SetPosition (0, transform.position);

Note

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

推荐阅读更多精彩内容