当前位置:   article > 正文

Unity零基础入门 - 见缝插针_开发gamemanager去生成针

开发gamemanager去生成针

Unity零基础入门 - 见缝插针(Unity2017)

02-创建工程和场景

导入资源:直接把资源从文件夹拖到Unity目录下
改变背景色:修改Camera颜色

03-开发旋转的小球和分数显示

使用资源:直接把目录下的资源拖到Sense里
分数显示:创建-UI-Canvas-Text,调节Text居中Reset、字体颜色、字体大小88等;设置Canvas的Render Mode为World Space(这样可以调节大小),Canvas宽高各设置为100,xy缩放比例为0,01

Render Mode:
Screen Space—Overlay:将UI渲染为摄像机视图顶部的2D图形(默认设置) Screen Space—Camera:也将UI渲染在摄像机视图顶部,但UI元素可以进行透视效果旋转 World Space:将画布对象放置在场景中,就好像UI是3D场景中的一部分

04-控制小球旋转

Rotato旋转默认逆时针
找不到脚本:注意类名与文件名一致

05-开发针的Prefab预制体

针:细杆+小圆,小圆组合于细杆下,再加入预制体,给小圆加上碰撞器。

06-开发GameManager去生成针
GameManager:Unity特殊脚本

07-控制针移动到就位位置
Pin脚本:给Prefab加脚本,在update()中控制当前物体向目标位置匀速运动,距离小于某小值时停止

if (isFly == false)
        {
            if (isReach == false)
            {
                transform.position = Vector3.MoveTowards(transform.position, startPoint.position, speed * Time.deltaTime);
                if (Vector3.Distance(transform.position, startPoint.position) < 0.05f)
                {
                    isReach = true;
                }
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

08-控制针的插入
改Prefab名,如果Prefab不变,可以在物体里Apply一下。
针运动目的地异常Bug:分析可能原因,可以采取禁用组件,打Debug.Log(),把脚本中组件改为public运行时查看其对应物体,
通过点击事件启动针中的运动

// Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            // 如果没有下面的SpawnPin(),针的移动会重新启动,导致针歪着
            currentPin.startFly();
            // Debug.Log(" currentPin.startFly()");
        }
    }

    void SpawnPin()
    {
        //类、位置、旋转
        //GameObject.Instantiate(pinPrefab, spawnPoint.position, pinPrefab.transform.rotation);
        currentPin = GameObject.Instantiate(pinPrefab, spawnPoint.position, pinPrefab.transform.rotation).GetComponent<Pin>();
        //Debug.Log(" currentPin" + currentPin == null);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

具体运动启动与停止的方法

// Update is called once per frame
    void Update () {

        if (isFly == false)
        {
            if (isReach == false)
            {
                transform.position = Vector3.MoveTowards(transform.position, startPoint.position, speed * Time.deltaTime);
                if (Vector3.Distance(transform.position, startPoint.position) < 0.05f)
                {
                    isReach = true;
                }
            }
        }
        else
        {
            transform.position = Vector3.MoveTowards(transform.position, targetCirclePos, speed * Time.deltaTime);
            if (Vector3.Distance(transform.position, targetCirclePos) < 0.05f)
            {
                isFly = false;
                transform.position = targetCirclePos;
                transform.parent = circle;
            }
        }

    }

    public void startFly()
    {
        //Debug.Log("startFly()");
        isFly = true;
        isReach = true;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

09-控制针达到的位置和针的连环发射
控制针达到的位置:从预制体生成一个针对象,控制针对象插到球表面,获得此时针的position(此针对象是临时的,所以实际坐标相对于球心的)。将这个position设置为针的目标点,针到达之后把针的父对象设置为圆,这样针就可以跟随圆旋转了。(如上)
针的连环发射:点击响应时,启动当前针移动后,还要生成一个新的针赋给当前针。

// Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            // 如果没有下面的SpawnPin(),针的移动会重新启动,导致针歪着
            currentPin.startFly();
            // Debug.Log(" currentPin.startFly()");
            //重新生成一个针
            SpawnPin();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

10-针头的碰撞和游戏结束的处理
针头的碰撞:给针头添加Circle Collider2D(Is Trigger 勾选碰撞触发)和Rigidbody 2D(Gravity Scale 重力加速度设为0),加脚本PinHead,记得给针头设置Tag

 private void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.Log("发生碰撞");
        if (collision.tag == "PinHead")
        {
            Debug.Log("针头碰撞");
            GameObject.Find("GameManager").GetComponent<GameManager>().GameOver();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
public void GameOver()
    {
        if (isGameOver) return;
        GameObject.Find("Circle").GetComponent<RotatoSelf>().enabled = false;
        isGameOver = true;
        //StartCoroutine(GameOverAnimation());
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

11-控制分数的显示

通过在点击发针的事件中增加并显示数字

void Update()
    {
        if (isGameOver) return;
        if (Input.GetMouseButtonDown(0))
        {
            score++;
            scoreText.text = score.ToString();
            // 如果没有下面的SpawnPin(),针的移动会重新启动,导致针歪着
            currentPin.startFly();
            // Debug.Log(" currentPin.startFly()");
            //重新生成一个针
            SpawnPin();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

12-游戏结束动画的显示
GameOver()中调用

IEnumerator GameOverAnimation()
    {
        while (true)
        {
            //插值动画,由当前色过渡到目标色
            mainCamera.backgroundColor = Color.Lerp(mainCamera.backgroundColor, Color.red, speed * Time.deltaTime);
            mainCamera.orthographicSize = Mathf.Lerp(mainCamera.orthographicSize, 4, speed * Time.deltaTime);
            if (Mathf.Abs(mainCamera.orthographicSize - 4) < 0.01f)
            {
                break;
            }
            yield return 0;
        }
        yield return new WaitForSeconds(0.5f);
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

游戏发布和运行
发布游戏:生成两个文件,一个exe和一个数据文件夹,两者缺一不可

复现见缝插针:如上

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/47988
推荐阅读
相关标签
  

闽ICP备14008679号