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

Posted 御雪妃舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程与数学:计算玩家面对面相关的知识,希望对你有一定的参考价值。

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


    

效果如图:

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

创作挑战赛 新人创作奖励来咯,坚持创作打卡瓜分现金大奖

以上是关于编程与数学:计算玩家面对面的主要内容,如果未能解决你的问题,请参考以下文章

基于java面对对象编程范式

[3D数学]向量

使用基于相机朝向的操纵杆的玩家运动

「数学」夹角公式

求解编程题目<猜数字>C++/C

OpenGL - 2D敌人不旋转面对玩家