首页 > 代码库 > 练手小游戏(代码篇之逻辑杂篇

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

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

 

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