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

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

        }

    }
}
时间: 2024-10-27 03:27:14

练手小游戏(代码篇之逻辑杂篇的相关文章

练手小游戏(代码篇之敌人AI

诶呀~又没有更新微博,去拔牙了,疼死了,休息了几天过来接着写代码~ 首先是Base.写了一个框架,照别人扒的. Base分三部分,AILocomotion(AI移动),Steering(行为基类),Vehicle(角色模型基类) 首先是Steering /// <summary> /// 角色行为基类 /// </summary> public class Steering : MonoBehaviour { /// <summary> /// 操控权重 /// <

练手小游戏(一个开始

诶呀,好久没发东西啦(反正也没人看).. 最近弄个小Demo练练手,看自己有没有能力组织一款游戏,目前还是比较顺利的. 攻击,特效,怪物AI,攻击反馈,血条都有了. 以后会出一些新想法或新东西,就发上来.. 老套路先上图~ 等有时间把各个模块分开来详细写一下~

练手小项目(2)-生活小助手--周公解梦

第一篇 练手小项目(2)-生活小助手--身份证查询 第二篇 练手小项目(2)-生活小助手--星座运势查询 我在想就是第三个药品查询要不要写出来,因为布局还在讨论用什么展示,因为药品有很多展示,我也不知道用什么展示. 这是一个很纠结的事情 我就先写第四个吧 周公解梦 其中代码有点错误我想用for循环进行判断返回数据有几个 但是总是失败,如果有看本篇贴子,解决了,给我留个言,在这篇帖子我只显示一个结果 布局跟简单的说 一个Edittext 获取数据,然后button进行数据提取发送到服务器 返回的数

练手小项目(2)-生活小助手--星座运势查询

上一篇内容 练手小项目(2)-生活小助手 今天星期一.趁着中午的歇息时间把 第二个写出来 星座运势,近期看看极客学院 用聚合数据做了天气预报的视频教程,不好评价他.看他在后面的代码变更那么大,我就知道,后面肯定做不下去,于是.就改代码了.代码变更那么大,有几个人会去理解,还不如我自己写................ 先看布局 点击去就是一个spinner 用几个textview显示查询内容   布局有点丑,主要是给别人做功能,UI我就不考虑 关于UI  我还是要贴下代码.假设你有想法就把他美化

Java制作最难练手速游戏,Faker都坚持不了一分钟

想练手速,来啊,互相伤害啊 Java制作最难练手速游戏,目测Faker也坚持不了一分钟 制作思路:只靠Java实现.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java.Java. 字母模型应该是整个游戏的主角,因为整个游戏过程中都涉及到它的运动,比如坠落,消失,产生等,首先应该考虑字母随即出现的位置,在游戏中不断下落,计算下落的高

【辅助程序】练手小程序:记录外网动态IP地址

练手小程序 程序作用:对IP实时记录: 1.定时获取外网IP,存储在本地文件中: 编写思路: 1)收集获取外网的API接口 http://bbs.125.la/thread-13838979-1-1.html 2)定时执行 http://blog.csdn.net/imzoer/article/details/8699083/ 4)记录本地文件 1 # -*- coding: utf-8 -*- 2 # -*- coding: gbk -*- 3 # Date: 2016/4/27 4 # Cr

java小游戏代码

一. 需求分析 曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起,一度遭到社会反感和家长抵制.但是,随着互联网的发展,和游戏潜在好处被发现,游戏的价值开始逐渐被社会认可,人们开始接受.认识和了解游戏带来的诸多好处. 现在学生的课业负担重,娱乐时间少,人际交往少,烦恼和压力也因此相应增加.其实玩游戏不仅帮助学生调节情绪,还可以锻炼与提高他们的反应能力和手脑的快速配合能力,同时帮助他们了解电脑和网络知识等,可谓是一举多得.据调查显示,经常玩游戏的学生思维活跃.善于表达.情绪乐观,解决问题时会

提取微信小游戏代码

微信小游戏会 打包成 .wxapkg 文件. 前提 root后的android手机,安装 re文件管理器 微信. 安装好nodejs环境的电脑 步骤 使用 root后的android手机 打开微信小游戏,记录下当时的时间. 然后使用 re文件管理器 到 /data/data/com.tencent.mm/MicroMsg/ 这个目录, 记为目录 A. 目录 A 下可能有多个 32位字符串的文件夹,依次打开,找到包含 appbrand 文件夹的那个目录,记为目录B. 如:/data/data/co

练手小项目:利用pygame库编写飞机大战游戏

pygame库已经很久不更新,毕竟使用python开发游戏的不多.本项目的目的在于训练自己的pthon基本功.了解中小型程序框架以及学习代码重构等.项目出自<Python编程 从入门到实践>中12-14章节的例子.另外写的博客貌似也没人看啊,有点沮丧.不过还是要沉住气,就权当自己的私人技术日记了.或许以后能成为技术大牛呢,傻笑:) giyhub地址: 效果图如下: 程序框架 alien_invasion.py 包含运行游戏的run_game函数 alien.py 外星人类 bullet.py