zoukankan      html  css  js  c++  java
  • unity3D引擎:2D游戏自动瞄准算法实现

    转:http://blog.csdn.net/naitu/article/details/39555373

    在很多飞行射击类游戏里,都有敌人向玩家自动瞄准并开火的功能。在这里本人用unity3D引擎新版本的2D系统来实现这个功能。

    首先,让我们了解一下原理的理论知识。我们可以把敌人和玩家放到一个坐标系中,敌人是坐标是的原点((0,0)点),玩家是在这个坐标系中的一点。然后把二者在坐标系中构建成直角三角形来计算坐标系的X轴旋转多少角度指向玩家。

    现在假设玩家分别放在坐标系的四个象限中,假设第一象限坐标为(X,Y),假设第二象限坐标为(-X,Y),假设第三象限坐标为(-X,-Y),假设第四象限坐标为(X,-Y)。分别求出它们的角度。

    tan角度=(敌人坐标Y-玩家坐标Y)/(敌人坐标X-玩家坐标X).

    要用代码求出角度,就要对上面的值进行反正切。注意反正切之后的值是弧度值不是角度值。我们还要把它进行弧度转角度操作。代码如下。

    angle =Mathf.Rad2Deg*Mathf.Atan ((transform.position.y- m_player.position.y) / (transform.position.x - m_player.position.x));

     

    当玩家在第一象限时,旋转角度为正数。当玩家在第四象限时,旋转角度为负数。注意,这里的旋转角度是敌人坐标X轴指向玩家所要旋转的角度。在unity中一般是把Y轴为向上方向。所以我们要Y轴指向玩家就要让敌人顺时针旋转90°。也就是让角度值减90°。

    angle=angle-90;

    当玩家在第三象限时,旋转角度为正数。当玩家在第二象限时,旋转角度为负数。注意,这里的旋转角度是敌人坐标-X轴指向玩家所要旋转的角度。我们要Y轴指向玩家就要让敌人逆时针旋90°。也就是让角度值加90°。

    angle=angle+90;

    要判断玩家在坐标系的一四象限还是二三象限很简单。敌人X坐标减去玩家X坐标小于0时,玩家在一四象限。否则在二三象限。

    if(transform.position.x - m_player.position.x < 0)

                                angle=angle-90;

                       else

                                angle=angle+90;

     

    求出了旋转角度,下面我们来设置物体的自身欧拉角。由于我们要旋转的是XY轴构成的平面。我们就要以Z轴为旋转轴来旋转。使物体绕自身坐标系绕Z轴,旋转angle度。

    transform.localEulerAngles=new Vector3(0,0,angle);

    这样敌人就可以根据玩家的位置自动瞄准了。最终代码如下;

    using UnityEngine;
    
    using System.Collections;
    
    public class enemy : MonoBehaviour {
    
    //申请一个变量存储角度值。
    
    private float angle;
    
    //申请一个变量存储玩家位置。
    
    public Transform m_player;
    
    //申请一个变量存储gun游戏物体的prefab。
    
    public Transform gun;
    
    void Start () {
    
    }
    
    void Update () {
    
    //计算角度
    
    angle =Mathf.Rad2Deg*Mathf.Atan ((transform.position.y - m_player.position.y) / (transform.position.x - m_player.position.x));
    
    //判断角度所在象限,并进行修正。
    
    if (transform.position.x - m_player.position.x < 0)
    
    angle=angle-90;
    
    else 
    
    angle=angle+90;
    
    //设置物体的自身欧拉角,是物体绕自身坐标系在Z轴,旋转Z度。
    
    transform.localEulerAngles=new Vector3(0,0,angle);
    
    //生成gun物体。
    
    //Instantiate (gun, transform.position, transform.rotation);
    
    }
    
    }
  • 相关阅读:
    [Ansible]copy 模块
    [Ansible]script模块
    [Ansible]command shell模块
    [Ansible]Systemd 模块
    [Ansible]YUM 模块
    [Ansible]yum_repository模块 添加 删除yum源
    [Ceph]osd 无法启动 start request repeated too quickly for ceph-osd@1.service
    [Ceph]pool 删除 Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
    题解 烷基计数 加强版 加强版
    Polya 定理 学习笔记
  • 原文地址:https://www.cnblogs.com/dj1232090/p/5668080.html
Copyright © 2011-2022 走看看