void on_card_touch(CCardPicture card_picture)
    {
        // 카드 연속 터치등을 막기 위한 처리.
        this.card_collision_manager.enabled = false;

        int count = this.player_hand_card_manager.Count;

        for (int i = 0; i < count; ++i)
        {
            this.player_hand_card_manager[i].enable_all_colliders(false);
        }


        // 일반 카드, 폭탄 카드에 따라 다르게 처리한다.
        if (card_picture.is_back_card())
        {
            CPacket msg = CPacket.create((short)PROTOCOL.FLIP_BOMB_CARD_REQ);
            CNetworkManager.Instance.send(msg);
        }
        else
        {
            // 손에 같은 카드 3장이 있고 바닥에 같은카드가 없을 때 흔들기 팝업을 출력한다.
            int same_on_hand =
                this.player_hand_card_manager[this.player_me_index].get_same_number_count(card_picture.card.number);
            int same_on_floor = get_same_number_count_on_floor(card_picture.card.number);
            if (same_on_hand == 3 && same_on_floor == 0)
            {
                CUIManager.Instance.show(UI_PAGE.POPUP_ASK_SHAKING);
                CPopupShaking popup =
                    CUIManager.Instance.get_uipage(UI_PAGE.POPUP_ASK_SHAKING).GetComponent <CPopupShaking>();
                popup.refresh(card_picture.card, card_picture.slot);
            }
            else
            {
                CPlayRoomUI.send_select_card(card_picture.card, card_picture.slot, 0);
            }
        }
    }
    void on_choice_shaking(byte is_shaking)
    {
        gameObject.SetActive(false);

        CPlayRoomUI.send_select_card(this.selected_card_info, this.card_slot, is_shaking);
    }