编程与数学:计算玩家面对面
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面对面");
效果如图:
好啦,玩家面对面的先到这里,欢迎多多交流!
创作挑战赛 新人创作奖励来咯,坚持创作打卡瓜分现金大奖以上是关于编程与数学:计算玩家面对面的主要内容,如果未能解决你的问题,请参考以下文章