# 游戏开发小结——在Unity中实现开放世界指南针

游戏开发小结——在Unity中实现开放世界指南针

如何在Unity中创建一个指南针,以帮助玩家在RPG中导航开放世界区域

在游戏中移动时,有两种常见的解决方案来帮助玩家定位:小地图或指南针。

在本文中,我们将重点介绍如何实现指南针,因为它很简单,并且在幻想类RPG中可能比带有物体和敌人追踪的完整小地图更具真实感。

您还可以实现很酷的效果,例如使指南针指示器像疯狂旋转以指示宝藏。

从玩家方位到基本方位

指南针是一个相当简单的工具:无论玩家朝向哪个方向,它总是指向北方。为了实现这一点,我们将创建一个带有指南针纹理的画布和图片。然后,我们将根据玩家朝向的变化,在其z轴上旋转指南针图像。
在这里插入图片描述

这个是我们可以使用的纹理图

实现

为了实现我们刚才所描述的内容,我们将创建一个Monobehaviour组件,将玩家的前方转换为旋转角度。如果我们认为在世界空间中,北方是朝向(0,0,1),那么我们可以获取玩家的前面位置,将y值设为0,并将其归一化。
通过这样做,我们可以将两个点都视为在一个圆上,并使用Mathf.Atan2函数来获取我们必须沿z轴旋转spirte图片的角度。
然后,我们需要进行最后的调整:这个角度计算给出了相对于x轴的角度,因此我们需要添加90度以相对于z轴设置它。
这给我们以下代码:

public class Compass : MonoBehaviour
{
    public Transform mPlayerTransform;
    
    [Tooltip("The direction towards which the compass points. Default for North is (0, 0, 1)")]
    public Vector3 kReferenceVector = new Vector3(0, 0, 1);
    
  
    private Vector3 _mTempVector;
    private float _mTempAngle;

    //Update每帧调用一次
    private void Update()
    {
        // 获取玩家的transform,将y设置为0并将其归一化
        _mTempVector = mPlayerTransform.forward;
        _mTempVector.y = 0f;
        _mTempVector = _mTempVector.normalized;

        // 获取到参考点的距离,确保y等于0并将其归一化(normalize)
        _mTempVector = _mTempVector - kReferenceVector;
        _mTempVector.y = 0;
        _mTempVector = _mTempVector.normalized;

        // 如果两个向量之间的距离为0,则会导致后续角度计算出现问题
        if (_mTempVector == Vector3.zero)
        {
            _mTempVector = new Vector3(1, 0, 0);
        }

        // 计算旋转角度(弧度),并进行调整
        _mTempAngle = Mathf.Atan2(_mTempVector.x, _mTempVector.z);
        _mTempAngle = (_mTempAngle * Mathf.Rad2Deg + 90f) * 2f;

        // 设置旋转
        transform.rotation = Quaternion.AngleAxis(_mTempAngle, kReferenceVector);

    }
}

在这里插入图片描述

恭喜,我们实现了指南针!

过后双手奉上源码,谢谢大家支持

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小云同志你好

谁能书阁下,白首太玄经

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值