Unity开发《一起来捉妖》教程 | 3.随机妖怪位置及旋转提示

洪流学堂,让你快人几步。你好,我是郑洪智。

洪流学堂公众号回复捉妖,可以获取本教程的源码工程


小新:“智哥,我找了个小精灵的模型,嘿嘿,不过我经常运行的时候找不到模型在哪,怎么办?”

大智:“这就需要增加提示的功能了,没有提示的话确实很难找。”

增加位置提示

大智:“小新,你觉得应该如何提示?”

小新:“我觉得可以在屏幕上加一个箭头,指示手机应该往哪边转。”

大智:“那这个箭头的方向如何计算呢?”

小新:“这个我有点想不出来。。。”

大智:“看我给你画的这张图,我们可以用向量模拟出来大致的旋转方向。”

小新:“哦,我看明白了。红色箭头就是应该看向的方向,绿色箭头是当前相机的方向,蓝色箭头就是提示旋转的方向。那如何计算呢?”

大智:“用向量的减法就行。蓝色向量 = 红色向量 - 绿色向量。得出的就是蓝色箭头的方向。”

小新:“我试试怎么写代码。”

void LateUpdate()
{
    UpdateArrow();
}
private void UpdateArrow()
{
    // 计算模型方向与当前相机方向的夹角
    var angle = Vector3.Angle(Camera.main.transform.forward, Target.position - Camera.main.transform.position);
    if (angle > 20) {
        Arrow.SetActive(true);
        // 由于本工程中箭头模型的y轴与箭头自身的方向相反,所以最前面得加个负号
        Arrow.transform.up = -(Target.position - Camera.main.transform.position - Camera.main.transform.forward);
    }
    else{
        Arrow.SetActive(false);
    }
}

大智:“不错哦,还加上了箭头是否显示的判断。”

随机精灵的位置

小新:“嘿嘿,我还有一个问题,怎么让精灵随机出现呢?”

大智:“一说到随机那肯定是用Random类咯。”

小新:“我现在尝试分别随机x,y,z,感觉我随机的效果不太好”

大智:“这里面的随机实际上你是想随机到距离相机一定的距离,比如说3米,对吧?”

小新:“对对”

大智:“那其实最终的结果是在一个球面上随机,你想想是不是?”

小新:“对,这样距离中心的位置都是一样的。”

大智:“Random这个类中就有Random.onUnitSphere;可以拿来用,不过这个随机出来的向量长度是1,还需要乘上你的举例哦。”

小新:“我明白了,我写一下试试。”

void SpawnSprite()
{
    var seed = Random.insideUnitSphere;
    // Y轴不要太高
    seed.y = seed.y * YRange;
    Target.position = seed * Distance + Camera.main.transform.position;
    // 精灵看向相机
    Target.LookAt(Camera.main.transform);
}

大智:“不错哦,我看你现在写代码已经考虑的比较全面了。这里面你把Y轴的值缩放了一下,这样精灵不至于刷新到头顶或者脚下,基本上是和手机水平的位置上。”

小新:“嘿嘿。最终的代码单独放到了GameManager中,如下:”

using UnityEngine;

public class GameManageer : MonoBehaviour
{
    // 目标模型
    public Transform Target;
    // 距离相机的位置
    public float Distance = 5;
    // 高度随机的范围
    public float YRange = 0.3f;

    // 箭头模型
    public GameObject Arrow;

    void Start()
    {
        SpawnSprite();
    }

    void LateUpdate()
    {
        UpdateArrow();
    }

    private void UpdateArrow()
    {
        // 计算模型方向与当前相机方向的夹角
        var angle = Vector3.Angle(Camera.main.transform.forward, Target.position - Camera.main.transform.position);

        if (angle > 20) {
            Arrow.SetActive(true);

            // 由于本工程中箭头模型的y轴与箭头自身的方向相反,所以最前面得加个负号
            Arrow.transform.up = -(Target.position - Camera.main.transform.position - Camera.main.transform.forward);
        }
        else{
            Arrow.SetActive(false);
        }
    }

    public void SpawnSprite()
    {
        var seed = Random.onUnitSphere;;
        // Y轴不要太高
        seed.y = seed.y * YRange;

        Target.position = seed * Distance + Camera.main.transform.position;

        // 精灵看向相机
        Target.LookAt(Camera.main.transform);
    }
}

总结

大智:“今天学习了用Unity开发《一起来捉妖》的第三部分,实现了随机妖怪位置及旋转提示。”

小新:“真是越来越好玩了。”

洪流学堂公众号回复捉妖,可以获取本教程的源码工程

今日思考题

大智:“动手将今天的工程部署到真机上体验一下。”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”

推荐阅读


《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。

发布了138 篇原创文章 · 获赞 72 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/zhenghongzhi6/article/details/92810076