编程与数学(一):计算玩家面对面

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HeBiReChenAi/article/details/81158617

最近听到这样一个需求,VR多人游戏的时候,当两个玩家面对面的情况下,才可以开始下一个流程:

听到一个人的解决方案是算距离,具体没问,觉得略感复杂,趁此机会也发挥程序与数学的相关性一直很强,从此篇开始会专门写一些程序与数学应用的博客。

好了切入正题,每个角色都有它的朝向,就是transform.forward,代表它的前方朝向,计算两个角色的朝向,在位置区域被物理限定的情况下,就是不会出现两个人向背的情况,两个forword的点乘的值是0代表垂直,1代表同方向,-1代表相反方向,也就是我们的面对面。

如此简单的解决相问题哈:

下面直接看我们的实例:
1.场景中两个角色代表
2.脚本如下:
这里写图片描述

3.运行结果动画如GIF:
这里写图片描述

可以看到打印日志,接近0的时候垂直,接近-1的首时候相对,当然实际项目中不需要精准的面对面,只要值得范围控制在-0.8到-1的范围。

好了,今天就到这里,下一篇会考虑一下问题:
1.向背的情况处理
2.两个角色在多大范围里处理相对问题

=============7.29更新===============
之前的方法存在一些问题,不过两个玩家朝相反方向,也成立-1条件,并且两个玩家不在一条直线上也会成立,所以今天会另外更新一个方法。

1.确定玩家的朝向关系。
可以获取两个玩家的位置向量相减,得到A玩家到B玩家的向量的单位向量,然后与A的Forward向量算点乘夹角来确定玩家朝向。
此时的点乘接近1,A面向B
如果接近-1A背向B

这里写图片描述

2.确定玩家面对面
基于1,确定A面向B,再结合之前的Forward,就可以确定两个玩家面对面可。

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

    public GameObject playerA;
    public GameObject playerB;

    float cos;
    float dir;
    Vector3 vecAB;

    // Update is called once per frame
    void Update()
    {
        //1 根据距离单位向量,确定一个玩家方向
        vecAB = playerB.transform.position - playerA.transform.position;
        cos = Vector3.Dot(vecAB.normalized, playerA.transform.forward);
        //Debug.Log(cos);
        if (cos > 0.8f && cos <= 1f)
        {
            Debug.Log("A 面向 B ");
        }

        //2 根据Forward点乘,共同确定两个玩家方向
        dir = Vector3.Dot(playerA.transform.forward, playerB.transform.forward);
        if (dir > -1f && dir < -0.8f)
            Debug.Log("A与B的方向相反");

        //3 根据以上两个条件共同判断,两个玩家相对
        if (cos > 0.8f && cos <= 1f)
        {
            if (dir > -1f && dir < -0.8f)
            {
                Debug.Log("A与B面对面");
            }
        }


    }
}

效果如图:
这里写图片描述

好啦,玩家面对面的先到这里,欢迎多多交流!

展开阅读全文

没有更多推荐了,返回首页