首先声明,博主Unity版本为5.4.4
玩过奥日与黑暗森林的应该都知道里面有个技能是当主角进入到可弹射范围时按下鼠标右键可以暂停时间然后选择角度,最后放开弹射,这篇就是来讲怎么搞这个技能
首先搭建一下场景(2d)

BirdHero

circle

arrow

场景搭建完后上代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class BushController : MonoBehaviour {
public float speed;
public LayerMask bushlayer;
public float bashRadius;
public float bashForce;
public float bushTime;
public Transform bashArrow;
private Rigidbody2D rb;
private Vector2 bashDirection;
private bool canBash;
private Collider2D[] bashPoint;
void Start () {
rb = GetComponent<Rigidbody2D> ();
}
void Update(){
Bash ();
}
void FixedUpdate () {
if(!canBash)
Movement ();
}
void OnDrawGizmos(){
Gizmos.color = Color.red;
Gizmos.DrawWireSphere (transform.position,bashRadius);
}
private void Movement(){
if (Input.GetKey (KeyCode.A) || Input.GetKey (KeyCode.D)) {
float x = Input.GetAxis ("Horizontal");
rb.velocity = new Vector2 (x * speed, rb.velocity.y);
}
if (Input.GetKeyUp (KeyCode.A) || Input.GetKeyUp (KeyCode.D)) {
rb.velocity = new Vector2 (0, rb.velocity.y);
}
}
private void Bash(){
if (Input.GetMouseButtonDown (1)) {
bashPoint = Physics2D.OverlapCircleAll (transform.position, bashRadius, bushlayer);
if (bashPoint.Length != 0) {
bashArrow.gameObject.SetActive (true);
bashArrow.position = bashPoint [0].transform.position;
StartCoroutine ("BushTimeWaiting");
Time.timeScale = 0;
canBash = true;
}
}
else if (Input.GetMouseButtonUp (1) && canBash) {
bashArrow.gameObject.SetActive (false);
Time.timeScale = 1;
bashDirection = Camera.main.ScreenToWorldPoint (Input.mousePosition) - bashPoint [0].transform.position;
bashDirection = bashDirection.normalized;
transform.position = new Vector3 (bashPoint [0].transform.position.x + bashDirection.x, bashPoint [0].transform.position.y + bashDirection.y, transform.position.z);
rb.velocity = Vector2.zero;
bashDirection.y = bashDirection.y * 1.5f;
bashDirection.x = bashDirection.x * 0.8f;
rb.AddForce (bashDirection * bashForce, ForceMode2D.Impulse);
StartCoroutine ("SetBashTime");
}
else if (Input.GetMouseButton (1) && canBash) {
Vector2 distance = Camera.main.ScreenToWorldPoint (Input.mousePosition) - bashPoint [0].transform.position;
distance.Normalize ();
float angle = Mathf.Atan2 (distance.y, distance.x) * Mathf.Rad2Deg;
bashArrow.transform.rotation = Quaternion.Euler (0,0,angle);
}
}
private IEnumerator BushTimeWaiting(){
float waitTime = Time.realtimeSinceStartup + bushTime;
while (Time.realtimeSinceStartup < waitTime) {
yield return null;
}
if (Time.timeScale == 0) {
Time.timeScale = 1;
canBash = false;
bashArrow.gameObject.SetActive (false);
}
}
private IEnumerator SetBashTime(){
float waitTime = Time.realtimeSinceStartup + 1;
while (Time.realtimeSinceStartup < waitTime) {
yield return null;
}
canBash = false;
}
}
最后的效果图
