美文网首页
初识unity3D-手势操作篇

初识unity3D-手势操作篇

作者: 旧歌i | 来源:发表于2018-11-19 19:07 被阅读126次

在被各种自定义view折磨之后。公司又来了新需求,之前实在是太忙,本来想着过段时间闲下来,将我之前写的无数个自定义view,挑几个有价值的,跟大家分享一下。谁想到,一重山是一重关啊,又来了一个3D模型的需求。刚开始想过从网上找3D模型的解析库。我们要解析的是obj dae fbx。但是找来找去,没有找到一个好的,或多或少都有些问题。后来经过一番折磨之后,选择了unity3D。我想着也可能是真正的大神不会总是分享自己的经验?所以android的3D模型才会发展的这么慢?不得而知。

好吧,进入正题吧。

首先我要实现的是显示模型,这个很简单了。需要将dae,obj或者fbx文件拖动到assets文件夹下面,然后呢将文件拖动到上面的主页上面。

拖到这里

然后我们可以看到上面有一个Main Camera和Directional Light,一个是主摄像机,另外一个是环境光。

然后下面的是我的模型,在还没有完全绘制完的模型就已经500M了,很难想象真正画完是有多大.

然后我们只需要将摄像机对准我们的模型,然后我们就可以去游戏视图中看到我们的模型。虽然我们在预览的页面可以上下左右的控制模型的旋转缩放和扩大,但是真正运行到手机上,却不能旋转缩放了 ,我一直以为运行到手机上能和预览效果一样呢。谁知道....

然后我就开始了爬坑操作。

从网上疯狂搜索关于unity3D模型的手势操作的代码,然后一遍又一遍的往里面粘贴,但是根本没有用。后来中潜下心来,用心摸索。终于实现了自己想要的结果,当然也有一部分代码是借鉴前贤手札,照葫芦画瓢的。

真是正题了

1.编写主摄像机的脚本

首先点击主摄像机,找到 Add  Component 并且点击。然后找到new script,新建一个脚本。

然后在里面声明一个公共变量

public Transform engTransform;

这个东西其实是我们一会要关联我们要查看的模型的关键字段。我们声明完这个字段之后执行保存操作,然后去看unity3D的面板,会多一个这个画面。

关联

然后我们可以将模型拖动到这个transform中,之后我们继续编写摄像机的脚本。

private Vector3 offset;

声明偏移量;

然后在start()方法中,让我们摄像机的transform对准我们模型的坐标位置。正对着。

然后计算摄像机和模型的初始偏移量,也就是距离。

transform.LookAt(engTransform.position);

 offset = transform.position - engTransform.position;

然后在update()方法中,

我们只需要用模型的位置坐标+偏移量 就得到了改变之后的摄像机的位置。

void Update () {

        transform.position = offset + engTransform.position;

    }

亏我踩了那么多坑,真相却如此赤裸裸。可能是真正的unity3D大神都已经不屑写这个东西了。所以在网上找的大多都有问题。

然后贴出模型的脚本文件。这里面有个问题需要澄清一下。

public class tyreTouch : MonoBehaviour

{

    private Touch oldTouch1;

    private Touch oldTouch2;

    private GameObject engGameObject;

    // Use this for initialization

    void Start()

    {

        engGameObject = GameObject.Find("engine");

    }

    // Update is called once per frame

    void Update()

    {

        //没有触摸

        if (Input.touchCount <= 0)

        {

            return;

        }

        if (Input.touchCount == 1)

        {

            Touch touch = Input.GetTouch(0);

            Vector2 deltaPos = touch.deltaPosition;

            engGameObject.transform.Rotate(Vector3.down * deltaPos.x, Space.World);

            engGameObject.transform.Rotate(-Vector3.right * deltaPos.y, Space.World);

        }

        Touch newTouch1 = Input.GetTouch(0);

        Touch newTouch2 = Input.GetTouch(1);

        if (newTouch2.phase == TouchPhase.Began)

        {

            oldTouch2 = newTouch2;

            oldTouch1 = newTouch1;

            return;

        }

        float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);

        float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);

        float offest = newDistance - oldDistance;

        float scaleFactor = offest / 1000f;

        Vector3 localScale = transform.localScale;

        Vector3 scale = new Vector3(localScale.x + scaleFactor, localScale.y + scaleFactor, +localScale.z + scaleFactor);

        if (scale.x > 0.3f && scale.y > 0.3f && scale.z > 0.3f)

        {

            engGameObject.transform.localScale = scale;

        }

        oldTouch1 = newTouch1;

        oldTouch2 = newTouch2;

    }

}

这是从网上粘过来的代码,我只改动了标黑的两处。

第一处是我们自己的模型,要替换为项目中我们自己模型的名字。

然后第二处,是我运行网上代码,发现的问题,我发现手势操作左右滑动时的方向是正确的,但是当我上下滑动时,方向却是相反的。所以我就将这个向量变成了负数,相应的y轴滑动方向也就是人类的习惯了。不再反人类。

o了,就到这,继续去学习unity3D,

有什么问题 大家随时交流!

相关文章

网友评论

      本文标题:初识unity3D-手势操作篇

      本文链接:https://www.haomeiwen.com/subject/ndiafqtx.html