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;
                }
            }
        }

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);
    }

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

// 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;
    }

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

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

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();
        }
    }
public void GameOver()
    {
        if (isGameOver) return;
        GameObject.Find("Circle").GetComponent<RotatoSelf>().enabled = false;
        isGameOver = true;
        //StartCoroutine(GameOverAnimation());
    }

11-控制分数的显示

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

void Update()
    {
        if (isGameOver) return;
        if (Input.GetMouseButtonDown(0))
        {
            score++;
            scoreText.text = score.ToString();
            // 如果没有下面的SpawnPin(),针的移动会重新启动,导致针歪着
            currentPin.startFly();
            // Debug.Log(" currentPin.startFly()");
            //重新生成一个针
            SpawnPin();
        }
    }

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);
    }

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

复现见缝插针:如上