• 练手小游戏(代码篇之逻辑杂篇


    其实呢,我这游戏就有一个简单的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);
                }
    
            }
    
    
        }
    }
  • 相关阅读:
    一个校园互联网实验室的纳新试题(试题整理)
    用CI框架向数据库中实现简单的增删改查
    CodeIgniter框架学习要点
    一个理解PHP面向对象编程(OOP)的实例
    为什么在需要使用‘template as a disambiguator’
    被忽略的class“特殊成员”—转换函数
    C++风格cast的优先级
    printf当前正在处理的格式化符是什么
    C++中模板特殊化(speicialization)的偏序关系及make规则选择
    PhysX中raycast和sweep对block和touch的处理逻辑
  • 原文地址:https://www.cnblogs.com/SHOR/p/5886746.html
Copyright © 2020-2023  润新知