美高梅娱乐4858.com娱乐开发之路小结(二):关于第一人称射击游戏支付实战小结

    (二)控制脚本,

  那些本子首要处理屏幕的UI方面,和娱乐的一对逻辑处理

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance = null;

    //游戏得分
    int score = 0;
   //游戏最高分
    static int highScore = 0;

    //弹药数量
    int amout = 100;
    //游戏主角
    Player player;

    Text txtAmout;
    Text txtHighScore;
    Text txtLife;
    Text txtScore;

    Transform canvasTranform;

    void Start()
    {
        Instance = this;

        player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();

        canvasTranform = GameObject.FindGameObjectWithTag("UI").GetComponent<Transform>();


        //依次获取canvas 下面的UGUI的内容
        foreach(Transform t in canvasTranform.GetComponentsInChildren<Transform>())
        {
            if(t.name.CompareTo("boot")==0)
            {
                txtAmout= t.transform.GetComponentInChildren<Text>();
                Debug.Log(txtAmout.text);
            }

            if(t.name.CompareTo("life")==0)
            {
                txtLife = t.transform.GetComponentInChildren<Text>();

            }

            if(t.name.CompareTo("score")==0)
            {
                txtScore = t.GetComponent<Text>();
            }

            if(t.name.CompareTo("highscore")==0)
            {
                txtHighScore = t.GetComponent<Text>();
            }
        }

        //初始化分数为0
        SetScore(0);

    }

    //更新分数
    public void SetScore( int _score)
    {
        score += _score;
        //
        if(score>highScore)
        {
            highScore = score;
        }
        txtScore.text="Score <color=yellow>"+score+"</color>";
        txtHighScore.text = "HighScore " + highScore;
        txtHighScore.color = Color.red;
    }

    //更新弹药
    public void SetAmout(int _amout)
    {
        amout -= _amout;

        //如果弹药为负数,填充
        if(amout<=0)
        {
            amout = 100;
        }

        txtAmout.text = amout.ToString() + "/100";
    }

    //更新生命值
    public void SetLife(int _life)
    {
        txtLife.color = Color.red;
        txtLife.text = _life.ToString();
    }

    //
    void OnGUI()
    {
        if(player.playerLife<=0)
        {
            //居中显示
            GUI.skin.label.alignment = TextAnchor.MiddleCenter;

            //改变字体大小
            GUI.skin.label.fontSize = 40;

            //显示GameOver
            GUI.Label(new Rect(0, 0, Screen.width, Screen.height), "Game Over");

            //设置按钮文字大小
            GUI.skin.label.fontSize = 30;
            //显示重新开始
            if(GUI.Button(new Rect(Screen.width*0.5f-150,Screen.height*0.75f,300,40),"再来一次"))
            {
                //重新读入
                Application.LoadLevel(0);
            }
        }
    }
}
  • Snake
    ’97
  • 【iOS & Android & WP;游戏】97 复古版的贪食蛇游戏,专供回想。

    在陶冶做那几个第一人称设计游戏的进度中学到了众多的事物,其中也有投机不足的地点,下边将在做那一个娱乐的历程中相见的题材和学到的东西记录下来。

下边带我们整理一下,看看开发者在这一个老古董上都有啥样立异的玩法:

  (一)首先从玩家类来说

美高梅娱乐4858.com,  在那些训练中,玩家类是一个相比主要类,里面定义了玩家的有的为主的数量,注意那里定义变量的经过中一旦不行变量或者措施在之后的费用中要调用的话,最好设置为共有的变量,那样就不会暴发获取不到的事态了,记得在求学c++课程的时候,老师平日说要用面向对象的思想去编程,那里我想可以把用到的变量设置为属性,例如将playerLife玩家的生命值设置为个人的变量,可以通过艺术的不二法门来先导化或者转移这么些生命值,还有就是由此质量的法子,例如public
static Life{get{return playerLife};set{playerLife=value} },这样的事例

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{


    //玩家的transform
    public Transform playerTraform;
    //获取玩家身上的charactercontrol组件
    CharacterController playerCC;
    //定义玩家的移动速度
    public float playerSpeed=5f;
    //定义玩家的生命值
    public float playerLife = 100f;

    //定义玩家的重力,当玩家通过控制器跳起来的时候
    public float playerGravity = 2f;
    /// <summary>
    /// 用于获取摄像机的变量
    /// 
    /// </summary>
    //摄像机的tranform
    Transform camTransform;
    //摄像机的旋转
    Vector3 camRot;
    //摄像机的高度
    float camHeight = 0.8f;


    ///
    //射击部分变量
    //枪口tranform
    Transform shootPoint;
    //射击射到的碰撞层
    public LayerMask shootMask;
    //射击射中后的粒子效果
    public Transform shootFX;
    //射击De 音效
    AudioSource shootMusic;
    public AudioClip shootClip;

    //射击的间隔时间
    float shootTime = 0f;

    //子弹伤害
    public int shootPower = 1;


    void Start()
    {
        //获取组件
        playerTraform = this.transform;

        playerCC = gameObject.GetComponent<CharacterController>();

        //获取摄像机
        camTransform = Camera.main.transform;
        Vector3 pos = playerTraform.position;
        pos.y += camHeight;
        camTransform.position = pos;

        //设置摄像机的旋转,与玩家的角度一致
        camTransform.rotation = playerTraform.rotation;
        camRot = camTransform.eulerAngles;
        //锁定鼠标
        Cursor.lockState = CursorLockMode.Locked;

        //获取音乐
        shootMusic = this.gameObject.GetComponent<AudioSource>();

        //获取枪口位置
        shootPoint = Camera.main.transform.FindChild("M16/weapon/muzzlepoint").transform;


        //初始化玩家的
        GameManager.Instance.SetLife((int)playerLife);


    }

    void Update()
    {
        //判断生命值是否为0
        if(playerLife<=0)
        {
            return;
        }

        //执行Control;
        Control();


        //射击部分的代码
        //

        //更新射击的时间
        shootTime -= Time.deltaTime;
        if(Input.GetMouseButton(0)&&shootTime<=0)
        {
            shootTime = 0.1f;
            //播放射击的音效
            shootMusic.PlayOneShot(shootClip);

            //减少弹药数量
            GameManager.Instance.SetAmout(1);

            //用Raycast用来做检测
            RaycastHit hit;

            //从枪口的位置,point点
            Ray ray=new Ray(shootPoint.position,camTransform.TransformDirection(Vector3.forward));
            if(Physics.Raycast(ray,out hit,1000,shootMask))
            {
                //如果射中
                if(hit.transform.tag.CompareTo("Enemy")==0)
                {
                    Enemy enemy = hit.transform.GetComponent<Enemy>();
                    //减少敌人的生命值
                    enemy.OnDamage(shootPower);
                }

                Instantiate(shootFX, hit.point, hit.transform.rotation);
            }

        }
    }


    /// <summary>
    /// 控制主角的移动
    /// </summary>
    void Control()
    {
        //获取鼠标的移动来进行方向的切换
        float h = Input.GetAxis("Mouse X");
        float v = Input.GetAxis("Mouse Y");

        //旋转摄像机设置
        camRot.x -= v;
        camRot.y += h;
        camTransform.eulerAngles = camRot;

        //设置主角的朝向与摄像机一致
        Vector3 playerRot = camTransform.eulerAngles;
        playerRot.x = 0;
        playerRot.z = 0;
        playerTraform.eulerAngles = playerRot;



        //主要玩家的移动控制

        //定义三个变量
        float x = 0f, y = 0f, z = 0f;

        //前后左右的移动
        //前
        if(Input.GetKey(KeyCode.W))
        {
            z += playerSpeed * Time.deltaTime;
        }
        //后
        if(Input.GetKey(KeyCode.S))
        {
            z -= playerSpeed * Time.deltaTime;
        }

        //左
        if(Input.GetKey(KeyCode.A))
        {
            x -= playerSpeed * Time.deltaTime;
        }
        //右
        if(Input.GetKey(KeyCode.D))
        {
            x += playerSpeed * Time.deltaTime;
        }

        //当玩家跳起来的时候,角色控制器会自动检测玩家的跳起
        y -= playerGravity * Time.deltaTime;


        //移动
        playerCC.Move(playerTraform.TransformDirection(new Vector3(x,y,z)));

        //摄像机的位置和主角位置一致
        Vector3 pos = playerTraform.position;
        pos.y += camHeight;
        camTransform.position = pos;

    }


    /// <summary>
    ///用来显示游戏中主角的位置
    /// </summary>
    void OnDrawGizmos()
    {
        Gizmos.DrawIcon(this.transform.position,"Spawn.tif");
    }


    //射击
    public void OnDamage(int damage)
    {

        playerLife -= damage;

        //更新UI
        GameManager.Instance.SetLife((int)playerLife);

        //判断生命值是否为0
        if (playerLife <= 0)
        {
            Cursor.lockState = CursorLockMode.Confined;
        }
    }

}

  在那么些类中,相比较根本的事物就是,在第一人称射击游戏中怎么通过鼠标的移动,转换成玩家视角的团团转,这几个是这几个类中比较紧要的地点,上边我将这一局地的代码单独拿出去:

void Control()
    {
        //获取鼠标的移动来进行方向的切换
        float h = Input.GetAxis("Mouse X");
        float v = Input.GetAxis("Mouse Y");

        //旋转摄像机设置
        camRot.x -= v;
        camRot.y += h;
        camTransform.eulerAngles = camRot;

        //设置主角的朝向与摄像机一致
        Vector3 playerRot = camTransform.eulerAngles;
        playerRot.x = 0;
        playerRot.z = 0;
        playerTraform.eulerAngles = playerRot;



        //主要玩家的移动控制

        //定义三个变量
        float x = 0f, y = 0f, z = 0f;

        //前后左右的移动
        //前
        if(Input.GetKey(KeyCode.W))
        {
            z += playerSpeed * Time.deltaTime;
        }
        //后
        if(Input.GetKey(KeyCode.S))
        {
            z -= playerSpeed * Time.deltaTime;
        }

        //左
        if(Input.GetKey(KeyCode.A))
        {
            x -= playerSpeed * Time.deltaTime;
        }
        //右
        if(Input.GetKey(KeyCode.D))
        {
            x += playerSpeed * Time.deltaTime;
        }

        //当玩家跳起来的时候,角色控制器会自动检测玩家的跳起
        y -= playerGravity * Time.deltaTime;


        //移动
        playerCC.Move(playerTraform.TransformDirection(new Vector3(x,y,z)));

        //摄像机的位置和主角位置一致
        Vector3 pos = playerTraform.position;
        pos.y += camHeight;
        camTransform.position = pos;

    }

要是您发觉更加多好玩的玩法,或者从中获得怎么着启示。也愿意能一起谈谈。

 (三)仇敌的逻辑

  主要成就仇敌的片段寻路处理,那里一个紧要的知识点就是寻路的安装,那在玩乐中是非凡重大的,要求编制仇人的Ai,那些类中完结了冤家每间隔一段的时刻更新玩家的地方音信作为仇人的靶子,然后经过动画的支配来达成行走,攻击等部分列的动作,紧如果经过判断玩家和仇敌之间的离开,其中动画部分的设计也是其一中的重点

using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour
{

    //生成敌人的脚本
    protected EnemySpawn enemyspawn;

    Transform enemyTransform;

    //主角
    Player player;
     //寻路组件

    NavMeshAgent enemyAgent;

    //移动速度
    float enemySpeed=1.0f;

    //敌人旋转速度
    float enemyRotate = 30f;
    //计时器
    float enemyTime = 2f;

    float enemyLife = 5f;

    //获取动画组件
    Animator enemyAni;

    //

    void Start()
    {
        enemyTransform = this.transform;

        //获取主角
        player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();

        //获取寻路组件
        enemyAgent = this.gameObject.GetComponent<NavMeshAgent>();
        //改变敌人的移动速度

        enemyAni = this.gameObject.GetComponent<Animator>();

        enemyAgent.speed = enemySpeed;

        //设置寻路的目标 即敌人的目标玩家
        enemyAgent.SetDestination(player.playerTraform.position);

    }


    //用于旋转敌人,使敌人面向玩家
    void RotaeToPlayer()
    {
        //获取目标方向
        Vector3 targetDir = player.playerTraform.position - enemyTransform.position;

        //计算出新的方向
        Vector3 newDir = Vector3.RotateTowards(enemyTransform.forward, targetDir, enemyRotate * Time.deltaTime, 0);
        enemyTransform.rotation = Quaternion.LookRotation(newDir);
    }


    void Update()
    {
        //生命值为0
        if(enemyLife<=0)
        {
            return;
        }

        //获取当前动画状态
        AnimatorStateInfo stateInfo = enemyAni.GetCurrentAnimatorStateInfo(0);
        //如果处于待机状态//并且不是处于转换的时候

        if(stateInfo.fullPathHash==Animator.StringToHash("First.idle")&&!enemyAni.IsInTransition(0))
        {
            enemyAni.SetBool("idle",false);

            //待机一定时间
            enemyTime -= Time.deltaTime;
            if(enemyTime<=0)
            {
                return;
            }

            //如果小于某个距离进行攻击
            if(Vector3.Distance(enemyTransform.position,player.playerTraform.position)<1.5f)
            {
                enemyAni.SetBool("attack", true);
            }

            else
            {

                //重置定时器
                enemyTime = 1f;

                //设置目标
                enemyAgent.SetDestination(player.playerTraform.position);

                //进入跑步的动画
                enemyAni.SetBool("run",true);

            }
        }

        //处于跑步的状态
        if(stateInfo.fullPathHash==Animator.StringToHash("First.run")&&!enemyAni.IsInTransition(0))
        {
            enemyAni.SetBool("run",false);

            //每隔一秒定位一次
            enemyTime -= Time.deltaTime;

            if(enemyTime<=0)
            {
                //重新开始寻路
                enemyAgent.Resume();

                enemyAgent.SetDestination(player.playerTraform.position);
                enemyTime = 1;

            }
            //距离小于1.5
            if(Vector3.Distance(enemyTransform.position,player.playerTraform.position)<1.5)
            {
                //停止寻路
                enemyAgent.Stop();

                enemyAni.SetBool("attack",true);
            }
        }

        //当处于攻击状态
        if(stateInfo.fullPathHash==Animator.StringToHash("First.attack")&&!enemyAni.IsInTransition(0))
        {
            //面向主角
            enemyAni.SetBool("attack",false);

            //如果动画播放完,重新待机
            if(stateInfo.normalizedTime>=1f)
            {
                enemyAni.SetBool("idle", true);

                //重置
                enemyTime = 2;

                //更新主角的生命值
                player.OnDamage(1);
            }
        }




        ////
        ////
        ////
        ////这里有一个Bug,不能进入death中,,,,,,,
        ////
        ///
        ////
        ///
        //当播放死亡的动画的时候
        if(stateInfo.fullPathHash==Animator.StringToHash("First.death"))
        {

            Debug.Log("进入");
            enemyTime-=Time.deltaTime;
            //播放完死亡的动画
            if(enemyTime<=0)
            {

                //减少敌人的数量
                enemyspawn.enemyCount--;

                //加分
                GameManager.Instance.SetScore(100);
                //摧毁自身

                Destroy(this.gameObject);
                Debug.Log("播放了死亡");


            }
        }

    }


    //计算伤害的函数
    public void OnDamage(int damage)
    {
        enemyLife -= damage;

        if(enemyLife<=0)
        {
            float time2 = Time.time;

            //停止寻路
            enemyAgent.Stop();
            //播放死亡动画
            enemyAni.SetBool("death",true);
        }
    }


    public void Init(EnemySpawn scirpt)
    {
        enemyspawn = scirpt;

        //增加敌人数量
        enemyspawn.enemyCount++;
    }
}

 

snake.PNG

   关于第一人称射击的玩乐,想起了本人玩过的第一款第一人称射击网游,当时很火热的《反恐精英Online》,当时也是玩那几个游乐的时候只好算得感觉好玩才去玩,现在再一次玩起那种第一人称射击类游戏的时候,能够说多了一个目标,带着欣赏的目标去玩,或者说我更想知道其中的法则,也就是说那几个动作或者那种功能是怎么落到实处的,做游戏支付的不只要知其然还要知其所以然,我想带着那样一种的学习态度大家才能在学习的长河中获得更加多的学问,那一点很要紧。

本周是Motorola150周年,近日游人如织和金立经典游戏贪食蛇(Snake)相关的一日游也都冒了出去。
这么一款简单的玩耍,有哪些尤其之处让大家这么喜爱呢?大家计算如下:

 (四)一些施用的类

    1.机动销毁类

  

using UnityEngine;
using System.Collections;

public class AutoDestroy : MonoBehaviour
{
    public float timer = 1.0f;

    void Start()
    {
        Destroy(this.gameObject, timer);
    }
}

  2.仇人生成

using UnityEngine;
using System.Collections;

public class EnemySpawn : MonoBehaviour
{
    //定义变量
    //敌人的prefab
    public GameObject enemyObj;
    //生成敌人的数量
    public int enemyCount;

    //敌人生成的最大数量
    public float enemyMaxCount;

    //敌人生成的时间间隔
    public float enemyTimer;

    Transform thisTransform;


    void Start()
    {
        thisTransform = this.transform;
    }


    void Update()
    {
        //生成敌人的数量达到最大值时候,停止生成敌人
        if(enemyCount>=enemyMaxCount)
        {
            return;
        }

        //每隔一段时间生成

        enemyTimer -= Time.deltaTime;

        if(enemyTimer<=0)
        {
            //得到下一轮敌人的生成时间
            enemyTimer = Random.Range(5, 15);

            GameObject tar = (GameObject)Instantiate(enemyObj, thisTransform.position, Quaternion.identity);

            Enemy enemyScript = tar.GetComponent<Enemy>();

            enemyScript.Init(this);
        }
    }
    void OnDrawGizmos()
    {
        Gizmos.DrawIcon(transform.position,"item.png");
    }
}

  3.小窗口的创立和出示,那里根本透过差别视频机呈现分歧的layer来已毕

using UnityEngine;
using System.Collections;



[AddComponentMenu("Game/MiniCamera")]
public class MiniCamera : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        float ratio = (float)Screen.width / Screen.height;

        this.GetComponent<Camera>().rect = new Rect((1-0.2f),(1-0.2f*ratio),0.2f,0.2f*ratio);
    }

}

 

  • Curvatron
  • 【Web &
    Android;单机多个人】和好友在一个屏幕上玩贪食蛇。和以往的贪食蛇直行不一致,那条蛇只会转圆圈。手机版协助双人游戏,网页版接济8 名玩家共享快乐。
  • Curvytron
  • 【Web,网游】多个人贪食蛇游戏。你可以和天下的玩家在网页上共同玩这一个游戏。如若你挂了,你的遗骸就会化为别人的绊脚石。百折不回到最后的人才能收获制胜。
  1. 目的显著:为了吃向前冲。
  2. 申报及时:吃掉目的立刻就变长。
  3. 平整简单:在小小的屏幕里,控制左右方向即可。
  • DoodleGrub
  • 【Android & iOS &
    WP等;单机】涂鸦风格的贪食蛇。道具系列是贪食蛇类最充裕的。
  • Quetzalcoatl
  • 【iOS;单机】最爱折腾虐心小游戏的1Button
    SARL做的一款类似贪食蛇的玩耍。本周改成了AppStore七天最佳榜产品。即使依旧是蛇形主演在显示屏上活动,但玩法上更像是华容道。
  • Agar.io
  • 【Web;网游】那货准确的说应该叫贪食球。因为吃食后不会变长而是变大。据称在B站很火,有人称之为和Curvytron齐名的“大”作。这也是一个在线网游,有事可能上万人一同竞赛。最为紧要的是,那些游戏中,玩家可是能够互相吞食的。大鱼吃小鱼是以此娱乐的最重点规则。
  • Snake
    Rewind
  • 【Android & iOS &
    WP;单机】当年流行环球的华为贪食蛇的原小编所作,在她的工作室中又再度创设的新版贪食蛇。并追加了各类新鲜道具,丰富玩法。
  • Snaky
    Lines
  • 【Android;单机】炫酷霓虹效果的竞速贪食蛇。(其实是小蝌蚪)

发表评论

电子邮件地址不会被公开。 必填项已用*标注