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

Posted Sooda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了练手小游戏(代码篇之逻辑杂篇相关的知识,希望对你有一定的参考价值。

其实呢,我这游戏就有一个简单的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);
            }

        }


    }
}

 

以上是关于练手小游戏(代码篇之逻辑杂篇的主要内容,如果未能解决你的问题,请参考以下文章

全栈之路-杂篇-探究springBoot中的条件注解

转载pythonpython练手项目

20个入门级Python项目

U3D入门小白教程——代码篇之三:常见脚本函数

值得学习练手的 5 个 Python 迷你程序(附代码)

iOS开发网络篇之Web Service和XML数据解析