U3D手记射击游戏10_17

公司最近忙着做业务,我也可以偷闲做做书里面的游戏,现在该我们做项目组了,吼吼,加油!!但也别忘了把书里的内容梳理总结一下。

射线:
定义射线时,默认可以这么写:bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward));
hit 表示是否射中目标,m_muzzlepoint.position表起始点,m_camTransform.TransformDirection(Vector3.forward)表方向(这里指m_camTransform的前方)。
游戏中一般这么写:bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward), out info, 100, m_layer);
这里m_layer来确定射线有效捕获的层。开始定义好public LayerMask m_layer;后,在Inspector窗口中的属性m_layer下拉列表加载。
示例代码:
        m_shootTimer -= Time.deltaTime;
        if (Input.GetMouseButton(0)&&m_shootTimer<=0)
        {
            //射击间隔时间
            m_shootTimer = 0.1f;
            //射击音效
            this.audio.PlayOneShot(m_audio);
            //减少弹药,更新弹药UI
            GameManager.Instance.SetAmmo(1);

            RaycastHit info;
            //从muzzlepoint的位置,向摄像机的正前方射出一根射线
            //射线与m_player所指定的层碰撞
            bool hit = Physics.Raycast(m_muzzlepoint.position, m_camTransform.TransformDirection(Vector3.forward), out info, 100, m_layer);
            if (hit)
            {
                if (info.transform.tag.CompareTo("enemy")==0)
                {
                    Enemy enemy = info.transform.GetComponent<Enemy>();
                    //减少敌人生命
                    enemy.OnDamage(1);
                }
                //射中其他地方,释放一个粒子效果
                Instantiate(m_fx, info.point, info.transform.rotation);
            }

        }
    游戏主角属性:游戏主角的属性在脚步中定义,并全局使用,比如主角的位置:在主角控制脚步Start函数内获得,在其他脚本都可以调用。
    m_agent.SetDestination(m_player.m_transform.position);//这是自动寻路物体m_agent,寻路目标为:m_player.m_transform.position,其中m_transform就是全局调用的Player.cs定义的属性

    自动寻路:(P60)不懂不知道,一弄真心感觉简单,呵呵,开玩笑,听说还有好几种方法,都不会,我也别大言不惭了。
    首先将场景模型的Static中的Navigation Static选中,无关的场景模型则确保没有被选中。具体是设置,可以在Window-->Navigation窗口中设置,
    Radius和Height表寻路者的半径和高度。
    Max Shope表最大攀爬坡度
    Step Height表最大通过楼梯台阶高度
    Drop Height表跳落高度极限
    Jump Distance表跳跃极限
    嗯嗯,完成设置后,点击右下角的Bake(烘焙),否则寻路物体无法移动且报错。
    场景设置好后,开始设置寻路物体,首先添加Component-->Nav Mesh Agent组件,然后在脚步中来控制寻路。
        Public class XL:MonoBehaviour()
        {
            Transform m_transform;                                           //敌人的Transform组件
            Player m_player;                                                 //游戏主角脚步组件
            NavMeshAgent m_agent;                                            //寻路组件

            void Start()
            {            
                m_transform = this.transform;
                m_agent = GetComponent<NavMeshAgent>();                      //获得寻路组件
                m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();//Player.cs脚本中定义了Player物体的位置,方便在寻路目标中调用

                m_agent.SetDestination(m_player.m_transform.position);       //设置m_agent寻路位置目标
                MoveTo();
            }
            void MoveTo()
            {
                float speed = m_moveSpeed * Time.deltaTime;
                m_agent.Move(m_transform.TransformDirection((new Vector3(0,0,speed))));
            }
        }
以上代码只执行初始寻路一次,根据实际情况可以在Update每一秒中寻路一次
            m_timer -= Time.deltaTime;
            if (m_timer<0)
            {
                m_timer = 1;
                m_agent.SetDestination(m_player.m_transform.position);
            }

实例:
            public static GameManager Instance = null;  //GameManager类中定义静态GameManager变量
    
            void Start()
            {
                Instance = this;//实例化仅此一次
            }
            //其他脚本可以直接调用脚本内容了
            GameManager.Instance.SetAmmo();


Unity3D中的实例必须用Instantiate(_model, point, rotate);


动画:
  void Update()
    {
        AnimatorStateInfo stateInfo = m_ani.GetCurrentAnimatorStateInfo(0);//获取当前动画状态***********重要**
        
        //如果处于待机状态
        if (stateInfo.nameHash==Animator.StringToHash("Base Layer.idle")&&!m_ani.IsInTransition(0))
        {
            m_ani.SetBool("idle",false);//设置动画过渡条件

            if (stateInfo.normalizedTime>=1.0f)//值位于0~1之间,0是动画开始,1是动画结束。此处表动画结束后
            {
                Destroy(this.gameObject);
            }
        }



小地图:提醒一个点,两个相机相互干扰的情况下,可以将Clear Flags设置为Depth ONLY;小地图要显示在前面,所以小地图相机的Camera组件的Depth要比主相机的Depth高一些。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值