洪流学堂,让你快人几步。你好,我是郑洪智。
洪流学堂公众号回复捉妖
,可以获取本教程的源码工程。
小新:“智哥,我找了个小精灵的模型,嘿嘿,不过我经常运行的时候找不到模型在哪,怎么办?”
大智:“这就需要增加提示的功能了,没有提示的话确实很难找。”
增加位置提示
大智:“小新,你觉得应该如何提示?”
小新:“我觉得可以在屏幕上加一个箭头,指示手机应该往哪边转。”
大智:“那这个箭头的方向如何计算呢?”
小新:“这个我有点想不出来。。。”
大智:“看我给你画的这张图,我们可以用向量模拟出来大致的旋转方向。”
小新:“哦,我看明白了。红色箭头就是应该看向的方向,绿色箭头是当前相机的方向,蓝色箭头就是提示旋转的方向。那如何计算呢?”
大智:“用向量的减法就行。蓝色向量 = 红色向量 - 绿色向量。得出的就是蓝色箭头的方向。”
小新:“我试试怎么写代码。”
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的朋友,也许能够帮到他。”
推荐阅读
- Unity开发《一起来捉妖》教程 | 2.用摄像头图像做背景
- Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机
- Unity 2019.1 中文更新日志速览版
- UnityWebRequest详解
- Unity中编码Encoding脱坑指南
- Unity中的Git最佳实践
- Unity2019更新规划速览,将有官方的可视化编程!
- Unity运行时更新带来了什么?
- Unity2018.3新功能 | Prefab嵌套和变体
- Unity3d中的百度语音识别及语音合成
《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。