zoukankan      html  css  js  c++  java
  • 练手小游戏(代码篇之逻辑杂篇

    其实呢,我这游戏就有一个简单的AI框架,其他的呢我就一起走了吧,写的还是挺乱的。

    比较重要的就是玩家控制类PlayerController~~~

    这里其实我把几个模块都写在一起了,比如输入控制(InputController),动画控制(AnimatorController),还有角色控制

    因为就是一个练手的,不用把各个平台的输入信息都整合了,所以InputController就不写了。

    我感觉动画控制和角色控制的分界线很微妙,所以也就写一起了~ 走代码备注很全

    //人物控制脚本
    public class PlayerController : MonoBehaviour {
    
        private Animator mAnimator; //自身Animator
        private CharacterController mCController; //人物控制器
        public GameObject Boom; //技能爆炸特效
        public GameObject Boom2; //技能爆炸特效2 (这两个不应该写在人物控制里,应该写在技能脚本中)
        private bool show = true; //控制技能释放 (同上)
        private int num = -1; //技能计时 (同上)
    
        private bool CanAnimation = true; //是否允许动画运行
        
        void Awake () { //初始化
            mAnimator = GetComponent<Animator>(); //获取自身Animator
            mCController = GetComponent<CharacterController>(); //获取自身人物控制器
        }
    
        void ShowBoom() //展示基本爆炸特效
        {
            GameObject boom = Instantiate(Boom) as GameObject;
            boom.transform.position = transform.position + transform.forward * 1.3f;
            boom.transform.localScale = Vector3.one;
            SphereCollider co = GetComponent<SphereCollider>();
            co.enabled = true;
        }
        
        IEnumerator skillTime() //技能CD计时函数
        {
            yield return new WaitForSeconds(1);
            Num.Instance.set(num);
            num--;
            if (num >= 0) StartCoroutine(skillTime());
        }
    
        void OnTriggerEnter(Collider other) //Trigger触发器,受伤害触发
        {
            if (other.gameObject.tag.Equals("MosterAttack")) //技能在MosterAttack的标签里
            {
                GetComponent<Life>().DelHP(10); //Life脚本控制血量,减少10血量
            }
        }
        
        void Update () {
    
            CanAnimation = true; 
    
            float h = Input.GetAxis("Horizontal"); //获取水平输入
            float v = Input.GetAxis("Vertical"); //获取竖直输入
    
            //获取鼠标射线,通过与地面的交点来控制人物朝向
            Ray ray = new Ray();
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            Vector3 pos = Vector3.zero;
            if (Physics.Raycast(ray, out hit))
            {
                pos = hit.point - transform.position;
                Vector3 newForward = Vector3.Slerp(transform.forward, pos, 5 * Time.deltaTime);
                newForward.y = 0;
                transform.forward = newForward;
            }
    
            if (Skiil.Instance.getShow()) //技能可以使用
            {
                if (Input.GetMouseButton(0)) //鼠标左键输入
                {
                    //创建技能2的爆炸
                    CanAnimation = false;
                    GameObject boom2 = Instantiate(Boom2) as GameObject;
                    boom2.transform.position = pos + transform.position;
                    boom2.transform.localScale = Vector3.one;
                    SphereCollider c = boom2.AddComponent<SphereCollider>();
                    c.radius = 1.5f;
                    c.isTrigger = true;
                    Rigidbody r = boom2.AddComponent<Rigidbody>();
                    r.useGravity = false;
                    num = 10;
                    StartCoroutine(skillTime());
                    Skiil.Instance.setShow();
                }
                if (Input.GetKeyDown("q")) //如果输入q建,让技能可用
                {
                    Skiil.Instance.setShow();
                }
            }
            else
            {
                if (Input.GetKeyDown("q") && num < 0) //如果技能CD中,q不能用
                {
                    Skiil.Instance.setShow();
                }
            }
    
            if (mAnimator && CanAnimation)
            { 
                AnimatorStateInfo stateLayer1 = mAnimator.GetCurrentAnimatorStateInfo(1); //获取Animator的状态
    
                mAnimator.SetFloat("Speed", h * h + v * v); //控制Speed的速度
                mCController.SimpleMove(new Vector3(h, 0, v) * 2f); //用人物控制器来移动
    
                if (Input.GetMouseButtonDown(0)) //输入左键人物普攻
                {
                    mAnimator.SetBool("DoubleAttack", true);
                }
                else
                {
                    mAnimator.SetBool("DoubleAttack", false);
                }
    
                if (stateLayer1.IsName("JumpAttack")) //如果状态为特殊攻击
                {
                    if (show)
                    {
                        Invoke("ShowBoom", 0.5f); //延迟触发爆炸效果,和碰撞器
                        show = false;
                    }
                }
                else
                {
                    show = true;
                    SphereCollider co = GetComponent<SphereCollider>();
                    co.enabled = false;
                }
    
                if (Input.GetMouseButtonDown(1)) //如果右键人物使用特殊攻击
                {
                    mAnimator.SetBool("JumpAttack", true);
                }
                else
                {
                    mAnimator.SetBool("JumpAttack", false);
                }
    
            }
    
    
        }
    }
  • 相关阅读:
    线程内唯一对象HttpContext
    asp.net MVC 路由机制
    asp.net MVC 路由机制 Route
    asp.net MVC 路由系统
    asp.net中的路由系统
    Nodejs 高并发长链接TCP链接的服务器设计问题
    关于SharePoint 2010中不能使用AjaxControlToolkit的解决办法
    百度编辑器批量上传图片自动排版
    phpcms后台部分修改
    PHP导入excel发送网易云信短信
  • 原文地址:https://www.cnblogs.com/SHOR/p/5886746.html
Copyright © 2011-2022 走看看