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