コード例 #1
0
ファイル: PlayerControl.cs プロジェクト: rx-pku/Unity
    [HideInInspector] public int dirc;                    //这个变量表明N极(红)所对应方向,0123分别表示上右下左。

    //private AudioManager amr;
    //private AudioClip clip_move = Resources.Load<AudioClip>("Sound/移动");

    void Start()
    {
        ani        = GetComponent <Animator>();
        rBody      = GetComponent <Rigidbody2D>();
        meg_script = MegArea.GetComponent <megarea_control>();
        IsGround   = true;
        IsOnPlayer = false;
        ani.SetBool("Isplayer1", Isplayer1?true:false);//选择玩家不同的动画

        //如果是另一个小人,则换精灵(磁极,脚 )
        if (!Isplayer1)
        {
            Dictionary <string, string> dic = new Dictionary <string, string>();
            dic.Add("MegArea", "player_1");
            dic.Add("foot_left", "player_13");
            dic.Add("foot_right", "player_14");

            Sprite[]         spPokers = Resources.LoadAll <Sprite>("player");
            SpriteRenderer[] childs;
            childs = GetComponentsInChildren <SpriteRenderer>();
            foreach (SpriteRenderer child in childs)
            {
                if (dic.ContainsKey(child.name))
                {
                    //child.sprite = spPokers.
                    foreach (Sprite sp in spPokers)
                    {
                        if (dic[child.name] == sp.name)
                        {
                            child.sprite = sp;
                            break;
                        }
                    }
                }
            }
        }
    }
コード例 #2
0
ファイル: megarea_control.cs プロジェクト: rx-pku/Unity
    //小人触发引力区域
    private void OnTriggerStay2D(Collider2D collision)
    {
        //非磁性物质引力模板
        if (collision.gameObject.tag == "???")//其它非磁物质,总吸引
        {
            Rigidbody2D other = collision.gameObject.GetComponent <Rigidbody2D>();
            Rigidbody2D rBody = GetComponentInParent <Rigidbody2D>();
            //int other_angel = collision.GetComponent<PlayerControl>().angle;
            Vector2 r_n = collision.gameObject.transform.position - NP.transform.position;
            Vector2 r_s = collision.gameObject.transform.position - SP.transform.position;
            float   mu  = Time.fixedDeltaTime * Maxstrength_H * other.mass;
            Vector2 f_n = (r_n.normalized) * mu /
                          (Mathf.Pow(Mathf.Max(r_n.magnitude, 0.2f), 3));
            Vector2 f_s = (r_s.normalized) * mu /
                          (Mathf.Pow(Mathf.Max(r_s.magnitude, 0.2f), 3));
            other.AddForce(-1f * f_n);
            other.AddForce(-1f * f_s);
            rBody.AddForceAtPosition(1f * f_n, NP.transform.position);
            rBody.AddForceAtPosition(1f * f_s, SP.transform.position);
        }
        //2个玩家相互吸引和排斥,重写磁力,改为线性磁力20190718
        //第4次调整模板20190718
        else if (collision.gameObject.tag == "Player")// collision.gameObject.tag == "Player")//与其它玩家,有相互吸引和排斥。
        {
            //取父物体的rdgidbody用于施力
            Rigidbody2D other = collision.gameObject.GetComponentInParent <Rigidbody2D>();
            //取对象的strength量及np,sp方位
            megarea_control other_script = collision.gameObject.GetComponentInChildren <megarea_control>();
            GameObject      other_NP     = other_script.NP;
            GameObject      other_SP     = other_script.SP;
            GameObject      other_CE     = other_script.CE;
            Vector2         other_dis    = other_NP.transform.position - other_SP.transform.position;
            Vector2         me_dis       = NP.transform.position - SP.transform.position;
            //4组距离向量
            //当2个小人站在单方向平台上时,计算它们自身的me_dis并不能==0,
            //而是无限接近于0,不能使用==0来判断  20190719
            if (Mathf.Abs(other_dis.x) < 0.1f && Mathf.Abs(me_dis.x) < 0.1f)
            {
                direct = 1;                                                             //上下结构
            }
            else if (Mathf.Abs(other_dis.y) < 0.1f && Mathf.Abs(me_dis.y) < 0.1f)
            {
                direct = 2;                                                                  //左右结构
            }
            else
            {
                direct = 0; force_type = 0;
            }
            if (direct == 1 || direct == 2)     //同为上下结构或左右结构时产生力
            {
                Vector2[] dis = new Vector2[4]; // r_n_n, r_s_s, r_n_s, r_s_n;
                if (direct == 1)
                {                               //上下结构
                    //上下结构中,如果2个角色减向量在x轴投影大于y轴投影,则磁力不成立。
                    //主要防止2个角色上下结构但并列排放时产生力作用
                    Vector2 ce_ver = other_CE.transform.position - CE.transform.position;
                    if (Mathf.Abs(ce_ver.x) > 0.75 * Mathf.Abs(ce_ver.y))
                    {
                        return;                                                //不成立时返回。
                    }
                    dis[0]             = new Vector2(0f, other_NP.transform.position.y - NP.transform.position.y);
                    dis[1]             = new Vector2(0f, other_SP.transform.position.y - SP.transform.position.y);
                    dis[2]             = new Vector2(0f, other_SP.transform.position.y - NP.transform.position.y);
                    dis[3]             = new Vector2(0f, other_NP.transform.position.y - SP.transform.position.y);
                    strength_max       = Maxstrength_V;
                    other_strength_max = other_script.Maxstrength_V;
                    strength_min       = Minstrength_V;
                    other_strength_min = other_script.Minstrength_V;
                }
                else if (direct == 2)//左右结构
                {
                    //同上下结构
                    Vector2 ce_ver = other_CE.transform.position - CE.transform.position;
                    if (Mathf.Abs(ce_ver.y) > 0.75 * Mathf.Abs(ce_ver.x))
                    {
                        return;                                                //不成立时返回。
                    }
                    dis[0]             = new Vector2(other_NP.transform.position.x - NP.transform.position.x, 0f);
                    dis[1]             = new Vector2(other_SP.transform.position.x - SP.transform.position.x, 0f);
                    dis[2]             = new Vector2(other_SP.transform.position.x - NP.transform.position.x, 0f);
                    dis[3]             = new Vector2(other_NP.transform.position.x - SP.transform.position.x, 0f);
                    strength_max       = Maxstrength_H;
                    other_strength_max = other_script.Maxstrength_H;
                    strength_min       = Minstrength_H;
                    other_strength_min = other_script.Minstrength_H;
                }
                //从4组向量中找出距离最小的向量进而施力,将其余向量置0
                float minn = 0x3f3f3f3f;
                int   pos  = 0;//取向量距离最小的向量序号
                for (int i = 0; i < 4; i++)
                {
                    if (minn > dis[i].sqrMagnitude)
                    {
                        pos  = i;
                        minn = dis[i].sqrMagnitude;
                    }
                }
                Vector2[] f_res  = new Vector2[4];                    // r_n_n, r_s_s, r_n_s, r_s_n;各个向量的力大小
                float     mu_max = strength_max + other_strength_max; // *Time.fixedDeltaTime ;
                float     mu_min = strength_min + other_strength_min;
                for (int i = 0; i < 4; i++)
                {
                    if (i == pos)
                    {
                        //线性磁力,在0.5到3.5的距离内,磁力从mu_max到mu_min之间线性递减
                        //mu为约定的磁铁挨在一起的最大磁力,0.5为约定的磁铁靠近时最近的距离,5f为约定的磁铁最远距离为3.5时的磁力值
                        f_res[i] = (dis[i].normalized) * Mathf.Max(0f, mu_max - (dis[i].magnitude - 0.5f) * (mu_max - mu_min) / (3.5f - 0.5f));
                        //Debug.Log("time:" + Time.fixedDeltaTime);
                        // Debug.Log("str:"+ strength_max + strength_max);

                        if (i < 2)
                        {
                            force_type = 2;       //0和1 时,斥力,否则引力。
                        }
                        else
                        {
                            force_type = 1;
                        }
                    }
                    else
                    {
                        f_res[i] = new Vector2(0f, 0f);
                    }
                }
                //Debug.Log(f_res[0]+ f_res[1]+ f_res[2]+ f_res[3]);
                //4组力施力
                other.AddForceAtPosition(1f * f_res[0], other_CE.transform.position);
                other.AddForceAtPosition(1f * f_res[1], other_CE.transform.position);
                other.AddForceAtPosition(-1f * f_res[2], other_CE.transform.position);
                other.AddForceAtPosition(-1f * f_res[3], other_CE.transform.position);
            }
        }
    }
コード例 #3
0
ファイル: Player_room.cs プロジェクト: rx-pku/Unity
    void Start()
    {
        ani        = GetComponent <Animator>();
        rBody      = GetComponent <Rigidbody2D>();
        meg_script = MegArea.GetComponent <megarea_control>();
        ani.SetBool("Isplayer1", Isplayer1?true:false);//选择玩家不同的动画

        //如果是另一个小人,则换精灵(磁极,脚 )
        if (!Isplayer1)
        {
            Dictionary <string, string> dic = new Dictionary <string, string>();
            dic.Add("MegArea", "player_1");
            dic.Add("foot_left", "player_13");
            dic.Add("foot_right", "player_14");

            Sprite[]         spPokers = Resources.LoadAll <Sprite>("player");
            SpriteRenderer[] childs;
            childs = GetComponentsInChildren <SpriteRenderer>();
            foreach (SpriteRenderer child in childs)
            {
                if (dic.ContainsKey(child.name))
                {
                    //child.sprite = spPokers.
                    foreach (Sprite sp in spPokers)
                    {
                        if (dic[child.name] == sp.name)
                        {
                            child.sprite = sp;
                            break;
                        }
                    }
                }
            }
        }
        //代码获取四个边共8个对象
        foreach (SpriteRenderer it in edges.GetComponentsInChildren <SpriteRenderer>())
        {
            switch (it.name)
            {
            case "left_n":
                left_n = it;
                break;

            case "left_s":
                left_s = it;
                break;

            case "right_n":
                right_n = it;
                break;

            case "right_s":
                right_s = it;
                break;

            case "top_n":
                top_n = it;
                break;

            case "top_s":
                top_s = it;
                break;

            case "bottom_n":
                bottom_n = it;
                break;

            case "bottom_s":
                bottom_s = it;
                break;
            }
        }
        Setedges();
    }