【学习日志】2022.10.26 Unity 愤怒的小鸟

Endlessdaydream/Endless_Unity_Projects: Unity Projects of Endlessdaydram (github.com)https://github.com/Endlessdaydream/Endless_Unity_Projects

Line Renderer (皮筋)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameMode : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        Destroy(gameObject);
        Destroy(collision.gameObject);
    }

    public static GameMode Instance { get; private set; }

    public Transform bird;
    public Transform center;

    public float maxDist = 3;
    public float maxForce = 700;

    LineRenderer[] lines;
    private void Awake()
    {
        Instance = this;
    }
    private void Start()
    {
        bird.position = center.position;
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = true;

        lines = center.parent.GetComponentsInChildren<LineRenderer>();
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);
    }
    public void BeginDrag()
    {
        bird.position = center.position;
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = true;

        lines = center.parent.GetComponentsInChildren<LineRenderer>();
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);
    }
    public void EndDrag()
    {
        //判断小鸟和中心点距离,准备弹出
        Vector3 v = bird.position - center.position;
        if(v.magnitude < 0.01f)
        {
            return;
        }
        //施加力弹出小鸟
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = false;
        float f = v.magnitude / maxDist * maxForce;
        rigid.AddForce(f * -v.normalized);
        //皮筋归位
        lines[0].SetPosition(0, center.position);
        lines[1].SetPosition(0, center.position);

    }
    public void Drag(Vector3 mousePos)
    {
        //屏幕坐标转世界坐标
        Vector3 pos = Camera.main.ScreenToWorldPoint(mousePos);
        pos.z = 0;

        //小鸟离中心点的距离
        Vector3 v = pos - center.position;

        if(v.magnitude > maxDist)
        {
            v = v.normalized * maxDist;
        }
        bird.position = center.position + v;

        //设置皮筋
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);

    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour
{  
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameMode.Instance.BeginDrag();
        }
        else
        {
            if (Input.GetMouseButton(0))
            {
                GameMode.Instance.Drag(Input.mousePosition);
            }
        }
        if (Input.GetMouseButtonUp(0))
        {
            GameMode.Instance.EndDrag();
        }
        

    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameMode : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        Destroy(gameObject);
        Destroy(collision.gameObject);
    }

    public static GameMode Instance { get; private set; }

    public Transform bird;
    public Transform center;

    public float maxDist = 3;
    public float maxForce = 700;

    LineRenderer[] lines;

    FollowCam cam;

    private void Awake()
    {
        Instance = this;
    }
    private void Start()
    {
        bird.position = center.position;
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = true;

        lines = center.parent.GetComponentsInChildren<LineRenderer>();
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);

        cam = Camera.main.GetComponent<FollowCam>();
    }
    public void BeginDrag()
    {
        bird.position = center.position;
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = true;

        lines = center.parent.GetComponentsInChildren<LineRenderer>();
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);
    }
    public void EndDrag()
    {
        //判断小鸟和中心点距离,准备弹出
        Vector3 v = bird.position - center.position;
        if(v.magnitude < 0.01f)
        {
            return;
        }
        //施加力弹出小鸟
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = false;
        float f = v.magnitude / maxDist * maxForce;
        rigid.AddForce(f * -v.normalized);

        cam.isFollow = true;
        //皮筋归位
        lines[0].SetPosition(0, center.position);
        lines[1].SetPosition(0, center.position);

    }
    public void Drag(Vector3 mousePos)
    {
        //屏幕坐标转世界坐标
        Vector3 pos = Camera.main.ScreenToWorldPoint(mousePos);
        pos.z = 0;

        //小鸟离中心点的距离
        Vector3 v = pos - center.position;

        if(v.magnitude > maxDist)
        {
            v = v.normalized * maxDist;
        }
        bird.position = center.position + v;

        //设置皮筋
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);

    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour
{  
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameMode.Instance.BeginDrag();
        }
        else
        {
            if (Input.GetMouseButton(0))
            {
                GameMode.Instance.Drag(Input.mousePosition);
            }
        }
        if (Input.GetMouseButtonUp(0))
        {
            GameMode.Instance.EndDrag();
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowCam : MonoBehaviour
{
    public Transform target;
    Vector2 offset;

    [HideInInspector]
    public bool isFollow = false;

    public Transform limit;
    Rect limitRect;

    void Start()
    {
        isFollow = false;
        offset = transform.position - target.position ;

        //计算限制范围的Rect
        limitRect.size = limit.localScale;
        limitRect.center = limit.position;

        Debug.Log("rect:{limitRect.xMin}{limitRect.xMax},{limitRect.yMin},limitRect.yMax}");
 
    }

    // Update is called once per frame
    void Update()
    {
        if (isFollow)
        {
            Vector3 v = target.position + new Vector3 (offset.x,offset.y,0);
            v.z = -10;

            //if (v.x < limitRect.xMin) { v.x = limitRect.xMin; }
            //if (v.x > limitRect.xMax) { v.x = limitRect.xMax; }
            //if (v.y < limitRect.yMin) { v.y = limitRect.yMin; }
            //if (v.y > limitRect.yMax) { v.y = limitRect.yMax; }

            //限定摄像头范围
            v.x = Mathf.Clamp(v.x, limitRect.xMin, limitRect.xMax);
            v.x = Mathf.Clamp(v.y, limitRect.yMin, limitRect.yMax);

            transform.position = v;
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameMode : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        Destroy(gameObject);
        Destroy(collision.gameObject);
    }

    public static GameMode Instance { get; private set; }
    public Transform bird;
    PlayerBirds playerBird; //bird身上的脚本组件
    public Transform center;

    public float maxDist = 3;
    public float maxForce = 700;

    LineRenderer[] lines;

    FollowCam cam;

    public Transform prefabPoint;
    Transform[] points;

    bool isBirdFlying = false;

    private void Awake()
    {
        Instance = this;
    }
    private void Start()
    {
        bird.position = center.position;
        playerBird = bird.GetComponent<PlayerBirds>();

        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = true;

        lines = center.parent.GetComponentsInChildren<LineRenderer>();
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);

        cam = Camera.main.GetComponent<FollowCam>();

        //绘制抛物线的点
        points = new Transform[20];
        for(int i = 0; i < points.Length; i++)
        {
            points[i] = Instantiate(prefabPoint);
            points[i].gameObject.SetActive(false);
        }

    }
    public void BeginDrag()
    {
        if (isBirdFlying)
        {
            return;
        }
        //显示所有的辅助点
        ShowPoints(true);
    }
    public void Drag(Vector3 mousePos)
    {
        if (isBirdFlying)
        {
            return;
        }
        //屏幕坐标转世界坐标
        Vector3 pos = Camera.main.ScreenToWorldPoint(mousePos);
        pos.z = 0;

        //小鸟离中心点的距离
        Vector3 v = pos - center.position;

        if (v.magnitude > maxDist)
        {
            v = v.normalized * maxDist;
        }
        bird.position = center.position + v;

        //设置皮筋
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);

        //绘制辅助线
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        float f = v.magnitude / maxDist * maxForce;
        float v0m = f * Time.fixedDeltaTime / rigid.mass;
        Vector2 v0 = -v.normalized * v0m;

        //过了时间t,小鸟位置
        //p = bird.position+(v0 * t +0.5f * Physics2D.gravity * t * t);
        float t = 0;
        for (int i = 0; i < points.Length; i++)
        {
            t += 0.2f;
            Vector2 p = (Vector2)bird.position + (v0 * t + 0.5f * Physics2D.gravity * t * t);
            points[i].position = p;
        }
    }
    public void EndDrag()
    {
        if (isBirdFlying)
        {
            return;
        }
        //判断小鸟和中心点距离,准备弹出
        Vector3 v = bird.position - center.position;
        if(v.magnitude < 0.01f)
        {
            return;
        }
        //施加力,弹出小鸟
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = false;
        float f = v.magnitude / maxDist * maxForce;
        rigid.AddForce(f * -v.normalized);
        playerBird.StartFly();

        cam.isFollow = true;
        isBirdFlying = true;

        //隐藏所有的辅助点
        ShowPoints(false);

        //皮筋归位
        lines[0].SetPosition(0, center.position);
        lines[1].SetPosition(0, center.position);
    }
    
    public void OnPlayerBirdDie()
    {
        //小鸟复位
        bird.position = center.position;
        isBirdFlying = false;
        cam.isFollow = false;
        cam.Follow();

        playerBird.ResetBird();
    }

    public void ShowPoints(bool visible)
    {
        foreach(var p in points)
        {
            p.gameObject.SetActive(visible);
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerBirds : MonoBehaviour
{
    bool dead = false;
    Rigidbody2D rigid;
    float startFlyTime = 0;
    void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (!dead)
        {
            Debug.Log("小鸟碰到了" + collision.collider.name);
            if (startFlyTime + 0.1f < Time.time)
            {
                Invoke("Die", 2.5f);
                dead = true;
            }
        }
    }
    private void Update()
    {
        //如果小鸟越界,则死亡
        if(transform.position.x > 25 || transform.position.x < -25 || transform.position.y > 30 || transform.position.y < -30)
        {
            Invoke("Die", 2.5f);
            dead = true;
        }
    }
    void Die()
    {
        GameMode.Instance.OnPlayerBirdDie();
    }
    public void StartFly()
    {
        startFlyTime = Time.time;
    }
    public void ResetBird()
    {
        rigid.isKinematic = true;
        //小鸟旋转归0
        transform.rotation = Quaternion.identity;
        //rigid.rotation = 0;  //作用与上面一句等价

        //小鸟速度归0
        rigid.velocity = Vector2.zero;
        rigid.angularVelocity = 0;

        dead = false;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour
{  
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameMode.Instance.BeginDrag();
        }
        else
        {
            if (Input.GetMouseButton(0))
            {
                GameMode.Instance.Drag(Input.mousePosition);
            }
        }
        if (Input.GetMouseButtonUp(0))
        {
            GameMode.Instance.EndDrag();
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pig : MonoBehaviour
{
    public float maxImpulse = 10;
    Animator anim;
    private void Start()
    {
        anim = GetComponent<Animator>();
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        //判断撞击力
        float m = 0;
        for(int i = 0; i < collision.contactCount; i++)
        {
            var c = collision.contacts[i];
            if (c.normalImpulse > m)
            {
                m = c.normalImpulse;
            }
        }
        if(m > maxImpulse)
        {
            Debug.Log($"{gameObject.name}冲击力{m}");
            //播放爆炸动画
            anim.SetTrigger("Die");
            Invoke("Die", 0.5f);
        }
        
    }
    void Die()
    {
        Destroy(gameObject);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowCam : MonoBehaviour
{
    public Transform target;
    Vector2 offset;

    [HideInInspector]
    public bool isFollow = false;

    public Transform limit;
    Rect limitRect;

    void Start()
    {
        isFollow = false;
        offset = transform.position - target.position ;

        //计算限制范围的Rect
        limitRect.size = limit.localScale;
        limitRect.center = limit.position;

        Debug.Log("rect:{limitRect.xMin}{limitRect.xMax},{limitRect.yMin},limitRect.yMax}");
    }
    public void Follow()
    {
        Vector3 v = target.position + new Vector3(offset.x, offset.y, 0);
        v.z = -10;
        v.x = Mathf.Clamp(v.x, limitRect.xMin, limitRect.xMax);
        v.x = Mathf.Clamp(v.y, limitRect.yMin, limitRect.yMax);
        transform.position = v;
    }

    // Update is called once per frame
    void Update()
    {
        if (isFollow)
        {
            Vector3 v = target.position + new Vector3 (offset.x,offset.y,0);
            v.z = -10;

            //if (v.x < limitRect.xMin) { v.x = limitRect.xMin; }
            //if (v.x > limitRect.xMax) { v.x = limitRect.xMax; }
            //if (v.y < limitRect.yMin) { v.y = limitRect.yMin; }
            //if (v.y > limitRect.yMax) { v.y = limitRect.yMax; }

            //限定摄像头范围
            v.x = Mathf.Clamp(v.x, limitRect.xMin, limitRect.xMax);
            v.x = Mathf.Clamp(v.y, limitRect.yMin, limitRect.yMax);

            transform.position = v;
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameMode : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        Destroy(gameObject);
        Destroy(collision.gameObject);
    }

    public static GameMode Instance { get; private set; }
    public Transform bird;
    PlayerBirds playerBird; //bird身上的脚本组件
    public Transform center;

    public float maxDist = 3;
    public float maxForce = 700;

    //尝试次数,小鸟几条命
    public int playerLives = 4;

    //剩余敌人数量
    public int enemyNum = 0;
    LineRenderer[] lines;

    FollowCam cam;

    public Transform prefabPoint;
    Transform[] points;

    bool isBirdFlying = false;

    private void Awake()
    {
        Instance = this;
    }
    private void Start()
    {
        bird.position = center.position;
        playerBird = bird.GetComponent<PlayerBirds>();

        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = true;

        lines = center.parent.GetComponentsInChildren<LineRenderer>();
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);

        cam = Camera.main.GetComponent<FollowCam>();

        //统计敌人数量
        GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
        enemyNum = enemies.Length;
        //绘制抛物线的点
        points = new Transform[20];
        for(int i = 0; i < points.Length; i++)
        {
            points[i] = Instantiate(prefabPoint);
            points[i].gameObject.SetActive(false);
        }

    }
    public void BeginDrag()
    {
        if (isBirdFlying)
        {
            return;
        }
        //显示所有的辅助点
        ShowPoints(true);
    }
    public void Drag(Vector3 mousePos)
    {
        if (isBirdFlying)
        {
            return;
        }
        //屏幕坐标转世界坐标
        Vector3 pos = Camera.main.ScreenToWorldPoint(mousePos);
        pos.z = 0;

        //小鸟离中心点的距离
        Vector3 v = pos - center.position;

        if (v.magnitude > maxDist)
        {
            v = v.normalized * maxDist;
        }
        bird.position = center.position + v;

        //设置皮筋
        lines[0].SetPosition(0, bird.position);
        lines[1].SetPosition(0, bird.position);

        //绘制辅助线
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        float f = v.magnitude / maxDist * maxForce;
        float v0m = f * Time.fixedDeltaTime / rigid.mass;
        Vector2 v0 = -v.normalized * v0m;

        //过了时间t,小鸟位置
        //p = bird.position+(v0 * t +0.5f * Physics2D.gravity * t * t);
        float t = 0;
        for (int i = 0; i < points.Length; i++)
        {
            t += 0.2f;
            Vector2 p = (Vector2)bird.position + (v0 * t + 0.5f * Physics2D.gravity * t * t);
            points[i].position = p;
        }
    }
    public void EndDrag()
    {
        if (isBirdFlying)
        {
            return;
        }
        //判断小鸟和中心点距离,准备弹出
        Vector3 v = bird.position - center.position;
        if(v.magnitude < 0.01f)
        {
            return;
        }
        //施加力,弹出小鸟
        Rigidbody2D rigid = bird.GetComponent<Rigidbody2D>();
        rigid.isKinematic = false;
        float f = v.magnitude / maxDist * maxForce;
        rigid.AddForce(f * -v.normalized);
        playerBird.StartFly();

        cam.isFollow = true;
        isBirdFlying = true;

        //隐藏所有的辅助点
        ShowPoints(false);

        //皮筋归位
        lines[0].SetPosition(0, center.position);
        lines[1].SetPosition(0, center.position);
    }
    
    public void OnPlayerBirdDie()
    {
        playerLives--;
        
        if (playerLives > 0)
        {
            //小鸟复位
            bird.position = center.position;
            isBirdFlying = false;
            cam.isFollow = false;
            cam.Follow();
            playerBird.ResetBird(); 
        }
        else
        {
            //等待几秒,然后判断Game Over
            Invoke("DelayGameOver", 2);
        }
    }

    void DelayGameOver()
    {
        if (enemyNum <= 0)
        {
            //游戏已经成功
            return;
        }
        Debug.Log("you loss");
    }
    public void ShowPoints(bool visible)
    {
        foreach(var p in points)
        {
            p.gameObject.SetActive(visible);
        }
    }
    public void OnPigDie()
    {
        enemyNum--;
        if (enemyNum <= 0)
        {
            Debug.Log("You Win!");
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour
{  
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameMode.Instance.BeginDrag();
        }
        else
        {
            if (Input.GetMouseButton(0))
            {
                GameMode.Instance.Drag(Input.mousePosition);
            }
        }
        if (Input.GetMouseButtonUp(0))
        {
            GameMode.Instance.EndDrag();
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerBirds : MonoBehaviour
{
    bool dead = false;
    Rigidbody2D rigid;
    float startFlyTime = 0;
    void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (!dead)
        {
            Debug.Log("小鸟碰到了" + collision.collider.name);
            if (startFlyTime + 0.1f < Time.time)
            {
                Invoke("Die", 2.5f);
                dead = true;
            }
        }
    }
    private void Update()
    {
        //如果小鸟越界,则死亡
        if(transform.position.x > 25 || transform.position.x < -25 || transform.position.y > 30 || transform.position.y < -30)
        {
            Invoke("Die", 2.5f);
            dead = true;
        }
    }
    void Die()
    {
        GameMode.Instance.OnPlayerBirdDie();
    }
    public void StartFly()
    {
        startFlyTime = Time.time;
    }
    public void ResetBird()
    {
        rigid.isKinematic = true;
        //小鸟旋转归0
        transform.rotation = Quaternion.identity;
        //rigid.rotation = 0;  //作用与上面一句等价

        //小鸟速度归0
        rigid.velocity = Vector2.zero;
        rigid.angularVelocity = 0;

        dead = false;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pig : MonoBehaviour
{
    public float maxImpulse = 10;
    Animator anim;
    private void Start()
    {
        anim = GetComponent<Animator>();
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        //判断撞击力
        float m = 0;
        for(int i = 0; i < collision.contactCount; i++)
        {
            var c = collision.contacts[i];
            if (c.normalImpulse > m)
            {
                m = c.normalImpulse;
            }
        }
        if(m > maxImpulse)
        {
            Debug.Log($"{gameObject.name}冲击力{m}");
            //播放爆炸动画
            anim.SetTrigger("Die");
            Invoke("Die", 0.5f);
        }
        
    }
    void Die()
    {
        GameMode.Instance.OnPigDie();
        Destroy(gameObject);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowCam : MonoBehaviour
{
    public Transform target;
    Vector2 offset;

    [HideInInspector]
    public bool isFollow = false;

    public Transform limit;
    Rect limitRect;

    void Start()
    {
        isFollow = false;
        offset = transform.position - target.position ;

        //计算限制范围的Rect
        limitRect.size = limit.localScale;
        limitRect.center = limit.position;

        Debug.Log("rect:{limitRect.xMin}{limitRect.xMax},{limitRect.yMin},limitRect.yMax}");
    }
    public void Follow()
    {
        Vector3 v = target.position + new Vector3(offset.x, offset.y, 0);
        v.z = -10;
        v.x = Mathf.Clamp(v.x, limitRect.xMin, limitRect.xMax);
        v.x = Mathf.Clamp(v.y, limitRect.yMin, limitRect.yMax);
        transform.position = v;
    }

    // Update is called once per frame
    void Update()
    {
        if (isFollow)
        {
            Vector3 v = target.position + new Vector3 (offset.x,offset.y,0);
            v.z = -10;

            //if (v.x < limitRect.xMin) { v.x = limitRect.xMin; }
            //if (v.x > limitRect.xMax) { v.x = limitRect.xMax; }
            //if (v.y < limitRect.yMin) { v.y = limitRect.yMin; }
            //if (v.y > limitRect.yMax) { v.y = limitRect.yMax; }

            //限定摄像头范围
            v.x = Mathf.Clamp(v.x, limitRect.xMin, limitRect.xMax);
            v.x = Mathf.Clamp(v.y, limitRect.yMin, limitRect.yMax);

            transform.position = v;
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    public Text playerNum;
    public Text pigNum;
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        int lives = GameMode.Instance.playerLives;
        playerNum.text = lives.ToString();

        int enemyNum = GameMode.Instance.enemyNum;
        pigNum.text = enemyNum.ToString();
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值