欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-30 08:39:26
...

最近听到这样一个需求,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面对面");
            }
        }


    }
}

效果如图:
编程与数学(一):计算玩家面对面

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

相关标签: Unity 数学