基于PF规则的CRPG制作尝试(五)近战攻击判定前的二三事

基于PF规则的CRPG制作尝试(五)近战攻击判定前的二三事

按之前决定的流程来说已经要进入到攻击判定部分了,但还是觉得有很多应该在此之前完成的东西,今天就把这些部分完善一下。

一、攻击轮次

这部分会在之后做成详细的:roll先攻——确定顺序——按顺序行动 流程,为了攻击判定的调试就暂且做成轮流攻击。方法也很简单,枚举(enum)出双方的state,然后无论是ActorController还是MonsterController都要在到达自己的回合后进行攻击。

        if (Input.GetKeyDown(KeyCode.Q))
        {
            if (gamestate == STATE.ORD)
            {
                print("1");
                gamestate = STATE.ACTOR;

            }
            if (gamestate == STATE.ACTOR)
            {
                gamestate = STATE.MONSTER;
                mc.myturn = true;
            }
            if (gamestate == STATE.MONSTER)
            {
                gamestate = STATE.ACTOR;
                ac.myturn = true;
            }
        }

在实践的时候发现ORD状态可以变成ACTOR,MONSTER也可以变成ACTOR,但是ACTOR无法转换为MONSTER状态,十分困惑…在逻辑层面好像也没什么bug的感觉,将后两个if变为else if之后就解决了…没有很懂是为什么。

二、鼠标悬停在模型上时识别出模型信息

搜索资料后发现大概有两种方法:
1.使用OnMouseOver函数,具体代码如下:

    private void OnMouseOver()
    {
        print(gameObject.ToString());
    }

就能打印出鼠标在哪个物体的上方。
2.还是使用之前点击鼠标移动那节的Ray方法:以摄像头为起点,经鼠标位置做一条射线,判定射线是否发生了碰撞,如果发生了碰撞,根据collider返回物体名称。具体代码如下:

 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitinfo;
        if (Physics.Raycast(ray, out hitinfo))
        {
            GameObject gob = hitinfo.collider.gameObject;
            print(gob.ToString());
        }

最开始我用第一种方法进行实践,发现Delta可以成功被识别,可Monster不行,然后在学习ray方法的时候根据代码分析,猜测会不会是因为没给Monster加胶囊碰撞体,检查了一下果不其然…加上之后两个方法就都可以成功识别了。

三、战斗中实时显示敌我距离

事实上并不复杂,只是有一些比较零碎的东西。

首先是调用攻击的敌人的信息,在此我就先直接选定攻击对象为名为skeletonzombie的敌人。代码如下:

 Monster = GameObject.Find("skeletonzombie");
        MonsterTrans = Monster.GetComponent<Transform>();
        //print(MonsterTrans.position.x+"+"+ MonsterTrans.position.y + "+" + MonsterTrans.position.z);

如果想要以点击对象为目标的话也不难,通过说过很多次的ray方法得到交点所在的目标名称,然后再用find方法赋给名为Monster的Gameobject,再getcomponent得到Monster的位置信息。
然后在怪物的模型下新建一个Canvas,再Canvas下新建一个TextMeshPro,选择TextMeshPro的原因是普通的Text好像不能将字体大小设为1以下,1以上对于我的模型来说又有点大。

之后是距离的计算,这里我选择分为两个部分,即ACTOR状态(角色移动的回合)外,实时显示的是敌我之间的距离,而在角色回合,点击产生移动预设线的时候,显示的是假设按预设线移动后的敌我距离。

1.计算敌我距离

即monsterdis

 monsterdis = (int)(Vector2.Distance(new Vector2(MonsterTrans.position.x, MonsterTrans.position.z), new Vector2(ActorTrans.position.x, ActorTrans.position.z))*100)/100.00f;

用的还是之前就用过的vector2.Distance方法,我为了显示的更加美观一些,将数值取了小数点后两位。
然后在显示距离的过程中,我发现用代码修改Text文字的方法对于修改TextMeshPro的文字并不适用,调查了资料之后发现应该使用如下方法:

Distext = GameObject.Find("Distance");
            Distext.GetComponent<TMP_Text>().text = "distance is " + monsterdis;

其中Distext是我修改后的TextMeshPro的名称。

2.按预设线移动后的敌我距离

同样是vector2.Distance方法,只不过计算的是敌方位置和移动预设线终点之间的距离(disaftermove)。
这段代码我选择写在绘制预设线函数 DrawPreviewLine中(见上一节):

disaftermove = (int)(Vector2.Distance(new Vector2(MonsterTrans.position.x, MonsterTrans.position.z),new Vector2(hitInfo.point.x, hitInfo.point.z)) * 100) / 100.00f;   

同时设置一个初始值为false的bool型变量ispremoving,当在点击鼠标右键绘制预设线,同时并未在移动时,将ispremoving的值改为true。点击鼠标左键确认移动时,将ispremoving的值改回false。这样一来,在ispremoving的值为true,即开始绘制预设线到沿预设线开始行进的过程中,UI中显示的就会是按预设线移动后的敌我距离了。

测距函数完整代码:

void ranging()
    {
        if (ispremoving == false)
        {
            monsterdis = (int)(Vector2.Distance(new Vector2(MonsterTrans.position.x, MonsterTrans.position.z), new Vector2(ActorTrans.position.x, ActorTrans.position.z))*100)/100.00f;
            print("非预设线状态下距离为"+monsterdis);
        }
        Distext = GameObject.Find("Distance");
        if (ispremoving==true)
            Distext.GetComponent<TMP_Text>().text = "distance after movement is " + disaftermove;
        else
            Distext.GetComponent<TMP_Text>().text = "distance is " + monsterdis;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值