使用Unity仿奥日弹射

首先声明,博主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;//存储可弹射点的信息

    // Use this for initialization
    void Start () {
        rb = GetComponent<Rigidbody2D> ();
    }

    void Update(){
        Bash ();
    }


    // Update is called once per frame
    void FixedUpdate () {
        if(!canBash)
        Movement ();
    }

    void OnDrawGizmos(){
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere (transform.position,bashRadius);
    }

    /// <summary>
    /// 移动角色
    /// </summary>
    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);
        }
    }


    /// <summary>
    /// 仿奥日弹射
    /// </summary>
    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;
            //修改x,和y方向的弹力系数大小
            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);
        }
    }

    /// <summary>
    /// 使用协程处理跟弹射点暂停的时间
    /// </summary>
    /// <returns>The time waiting.</returns>
    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);
        }
    }

    /// <summary>
    /// 弹射过程中不能在水平方向有移动
    /// </summary>
    /// <returns>The bash time.</returns>
    private IEnumerator SetBashTime(){
        float waitTime = Time.realtimeSinceStartup + 1;
        while (Time.realtimeSinceStartup < waitTime) {
            yield return null;
        }
        canBash = false;
    }   
}

最后的效果图

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值