unity官方demo学习:Survival Shooter

【原文】http://unity3d.com/learn/tutorials/projects/survival-shooter

以下所有素材和代码来自官网。


步骤

1 简介


本练习能够帮助初学者更加深刻的了解到锁定视角的3D游戏制作流程,新增了射线相交检测、自动寻路、高级UI等内容。

2 搭建基本场景


  • 加载整个游戏场景
  • 添加地板
  • 添加游戏背景音乐

3 添加游戏player


  • 加载player模型
  • 添加动画控制器
  • 编写player的移动脚本(射线相交检测、跟踪旋转)

4 设置摄像机


  • 移动摄像机到合适位置,设置好旋转角
  • 编写摄像机跟随脚本(有移动延迟效果)

5 添加单个敌人


  • 加载一个敌人角色到场景
  • 添加敌人角色动画控制器
  • 绑定碰撞体
  • 烘焙场景导航网格
  • 编写敌人的移动脚本使其跟随player

6 添加player血条GUI


  • 添加canvas元素导场景(2D视角)
  • 添加红心和血条slider
  • 添加角色受伤遮罩图片(注意相对坐标)

7 设置player掉血逻辑


  • 添加player掉血以及死亡音效
  • 编写player掉血脚本
  • 编写enemy攻击脚本
  • 脚本间通信


8 攻击敌人


  • 为player角色添加枪火粒子效果、射击线、音效、灯光效果
  • 编写player的射击脚本
  • 添加enemy角色的被射击效果、音效
  • 编写enemy角色的掉血和死亡逻辑脚本

9 得分画面


  • 添加得分GUI元素
  • 编写分数管理器脚本(全局static类成员)
  • 编写enemy掉血脚本中贡献分数的逻辑
  • 移除单个敌人(为后面做准备)


10 批量产生敌人


  • 场景中添加批量敌人产生管理器
  • 编写敌人管理器脚本

11 Game Over画面


  • 添加canvas里面多个元素的关键帧动画,构成game over的影片剪辑
  • 为该影片剪辑设置动画控制器
  • 编写脚本添加动画触发逻辑以及管卡重启逻辑

代码

有几段关键代码。

1 延迟动作

void FixedUpdate()
    {
        Vector3 targetCamPos=target.position+offset;
        transform.position=Vector3.Lerp(transform.position,targetCamPos,smoothing*Time.deltaTime);
    }

2 射线相交性检测

void Shoot ()
    {
        timer = 0f;

        gunAudio.Play ();

        gunLight.enabled = true;

        gunParticles.Stop ();
        gunParticles.Play ();

        gunLine.enabled = true;
        gunLine.SetPosition (0, transform.position);

        shootRay.origin = transform.position;
        shootRay.direction = transform.forward;

        if(Physics.Raycast (shootRay, out shootHit, range, shootableMask))
        {
            EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> ();
            if(enemyHealth != null)
            {
                enemyHealth.TakeDamage (damagePerShot, shootHit.point);
            }
            gunLine.SetPosition (1, shootHit.point);
        }
        else
        {
            gunLine.SetPosition (1, shootRay.origin + shootRay.direction * range);
        }
    }

3 导航网格辅助自动寻路

void Update ()
    {
        if(enemyHealth.currentHealth > 0 && playerHealth.currentHealth > 0)
        {
            nav.SetDestination (player.position);
        }
        else
        {
            nav.enabled=false;
        }
    }

4 实例化物体

void Spawn ()
    {
        if(playerHealth.currentHealth <= 0f)
        {
            return;
        }

        int spawnPointIndex = Random.Range (0, spawnPoints.Length);

        Instantiate (enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);
    }



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值