<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های سارا افتخاری</title>
        <link>https://virgool.io/feed/@sarabre26</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 23:59:29</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/731705/avatar/Rx0CqQ.jpeg?height=120&amp;width=120</url>
            <title>سارا افتخاری</title>
            <link>https://virgool.io/@sarabre26</link>
        </image>

                    <item>
                <title>الگوریتم هایی برای حل بازی Match-3</title>
                <link>https://virgool.io/@sarabre26/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D9%87%D8%A7%DB%8C%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AD%D9%84-%D8%A8%D8%A7%D8%B2%DB%8C-match-3-szkyul7brqv7</link>
                <description>بازی Match-3 از بازی‌های پازلی هستند که در آن بازیکن می‌خواهد ۳ یا بیشتر از ۳ آیتم را طبق الگوی خاصی در کنار هم قرار دهد. این آیتم‌ها معمولا با اشیایی یا نمادهایی به رنگ‌های مختلف نمایش داده می‌شوند و وقتی در کنار هم قرار بگیرند محو می‌شوند و بازیکن امتیازهایی به دست می‌آورد.بازی‌های Match-3 جزو پردرآمدترین بازی‌های ویدیویی جهان به حساب می‌آیند و همچنین این بازی‌ها برای تمام سنین و افراد مناسب است.اولین بازی Match-3 در سال ۱۹۸۴ میلادی توسط یک توسعه‌دهنده‌ی بازی روسی ساخته شده و تا الآن بیش از هزاران بازی در این سبک آمده است. می‌توان گفت این سبک از بازی‌ها جزو اولین بازی ویدیوها بوده و همچنان طرفداران زیاد خودش را دارد.اما از تاریخچه‌ی این بازی که بگذریم، شاید لازم باشد توضیحات بیشتری از نظر ساختاری درباره‌ی این بازی بدهیم.برد بازی: زمین یا صفحه‌ی بازی شامل سلول‌هایی مانند جدول است که هر یک از  آیتم ها در یکی از این سلول‌ها قرار می‌گیرد.تطبیق: بازیکن می‌تواند یک آیتم را با آیتم‌های مجاور برای ساختن یک ردیف یا یک ستون سه‌تایی یا بیشتر از آیتم‌ها جابه‌جا کند. (بسته به طراحی بازی گاهی الگوهای دیگر نیز قابل قبول است.)سقوط مهره‌ها: پس از این که یک الگو مچ شد و مهره‌ها محو شدند، مهره‌ها به صورت آبشاری از بالا دوباره در زمین بازی می‌ریزند و جاهای خالی را پر می‌کنند.اهداف: این بازی می‌تواند هدف‌های متفاوتی داشته باشد. اهداف معمولا شامل جمع کردن تعدادی مهره مشخص یا پاک کردن آیتم خاصی به صورت کامل از روی صفحه یا انجام دادن الگوهای خاصی در زمانی محدود یا تعداد حرکات محدود است.پاورآپ‌ها و آیتم‌های ویژه: در بعضی از بازی‌های Match-3 با جور کردن الگوهایی پیچیده‌تر از سه آیتم کنار هم می‌توانیم آیتم‌های ویژه‌ای مثل بمب‌ها دریافت کنیم. این آیتم‌ها کمکی به بازیکن هستند تا بتوانند در یک حرکت تعداد بیشتری مهره جمع کند.این بازی معمولا چندین Level دارد که با رد کردن هر کدام مرحله‌ی جدیدی باز می‌شود.اکنون شناخت بهتری از این بازی داریم. الگوریتم‌های زیادی برای حل بازی match 3 وجود دارند. در ادامه به معرفی بعضی از الگوریتم‌های معروف برای حل این بازی می‌پردازیم.Brute force زوری یا نیروی بی رحماین الگوریتم  ساده‌ترین و ابتدایی‌ترین الگوریتم برای حل این مساله است. این روش بر مبنای توان محاسباتی است و درگیر بهینه‌سازی نمی‌شود.به عنوان مثال فکر کنید یک رمز چهار رقمی داریم که باید آن را پیدا کنیم. در این الگوریتم تمام ترکیب‌های ممکن تست می‌شود. یعنی از ۰۰۰۰ تا ۹۹۹۹ را پیاده‌سازی کرده تا ببیند کدام رمز مورد نظر بوده است.این الگوریتم برای حل بازی match-3 شامل تست تمام حرکات ممکن است و بعد از آن انتخاب راهی که بهترین خروجی را به ما داده است.１- بررسی تمام حرکات موجود (تمام آیتم‌هایی که می‌تواند جابه‌جا کند)２- پیش‌بینی شکل برد و محل قرار گرفتن مهره‌ها بعد از انجام این حرکت３- محاسبه‌ی تعداد مچ‌هایی که در آن حالت می توان داشت４- انتخاب بهترین حرکتdef brute_force_move(game_board):
    best_move = None
    best_score = 0

    for row in range(len(game_board))

        for col in range(len(game_board[0])):
            # Try swapping with the right neighbor
            if col &lt; len(game_board[0]) - 1:
                # Simulate the game state after the swap
                # Evaluate the game state and update best_move and best_score if needed

            # Try swapping with the bottom neighbor
            if row &lt; len(game_board) - 1:
                # Simulate the game state after the swap
                # Evaluate the game state and update best_move and best_score if needed
    return best_moveBacktrackingعقبگرداین الگوریتم شبیه به نیروی بی‌رحم است اما تفاوت‌هایی دارد که آن را توضیح می‌دهم. این الگوریتم تمام راه‌حل‌ها را آزمایش می‌کند و هر کجا که راه‌حل ما مناسب نبود به عقب برمی‌گردد و راه جدیدی را امتحان می‌کند. (بر خلاف ‌Brute Force که تمام راه‌ها را آزمایش کرده و بعد جواب را بین آن‌ها پیدا می‌کند.)مراحل حل match-3 توسط این الگوریتم به صورت زیر است:1- اسکن گیم برد: گیم‌برد را برای پیدا کردن تطبیق‌ها اسکن می‌کنیم.2- پیدا کردن مچ‌ها: به دنبال مچ‌های عمودی و افقی می‌گردد. بعد از پیدا کردن یکی از آن‌ها آن را انجام می‌دهیم تا تاثیرات این مچ را ببینیم.3- مشاهده تاثیرات مچ: بعد از انجام مچ برای دیدن تاثیرات آن این اتفاق را شبیه‌سازی می‌کنیم. بدین صورت که اگر حرکت باید جایزه‌ای دریافت کند آن را می‌دهیم و مهره‌های بالایی را پایین بریزیم تا جای خالی آن‌ها پر شود.4- تکرار: مراحل 2 و 3 را دوباره در گیم‌برد جدید تکرار می‌کنیم تا زمانی که دیگر هیچ تطابقی پیدا نکنیم. 5- در این مرحله گیم برد ما کامل شده و تاثیرات تطابق‌هایی که انجام داده‌ایم را می‌بینیم. در هر کدام از این مراحل اگر به جایی برسیم که بازی ما حل نشده بود و شکست خورده بودیم، یک مرحله به عقب برمی‌گردیم و مسیر بعدی را انتخاب می‌کنیم و این کار را مجددا انجام می‌دهیم.# Define a function to check for and remove matching tiles
def remove_matches(board):
    rows = len(board)
    cols = len(board[0])
    matched = False

    # Check for horizontal matches
    for row in range(rows):
        for col in range(cols - 2):
            if board[row][col] == board[row][col + 1] == board[row][col + 2]:
                board[row][col] = 0
                board[row][col + 1] = 0
                board[row][col + 2] = 0
                matched = True

    # Check for vertical matches
    for col in range(cols):
        for row in range(rows - 2):
            if board[row][col] == board[row + 1][col] == board[row + 2][col]:
                board[row][col] = 0
                board[row + 1][col] = 0
                board[row + 2][col] = 0
                matched = True
    return matched

# Define a function to perform gravity and fill empty spaces after matches are removed
def perform_gravity(board):
    rows = len(board)
    cols = len(board[0])
    for col in range(cols):
        non_zeros = [board[row][col] for row in range(rows) if board[row][col] != 0]
        zeros = [0] * (rows - len(non_zeros))
        board_column = zeros + non_zeros
        for row in range(rows):
            board[row][col] = board_column[row]

# Define a function to resolve the Match-3 game using backtracking
def resolve_match3(board):
    while remove_matches(board):
        perform_gravity(board)Mini Maxکمین‌ بیش (تقلیل یافته)این الگوریتم اکثرا برای بازی‌های دو نفره است.می‌توان الگوریتم را تقلیل داد تا برای بازی Match-3 مناسب شود و چیدمان رندوم زمین را به عنوان حریف خود بگیریم. این الگوریتم بدین شکل است که درختی به وجود می‌آورد و در هرمرحله اگر نوبت شما باشد بهترین حرکت را انتخاب می‌کند و اگر نوبت حریف باشد بدترین حرکت را انتخاب می‌کند تا در انتها بیشترین امتیاز ممکن را به عنوان بهترین راه انتخاب کند.مراحل حل match-3 توسط این الگوریتم به صورت زیر است:1- اسکن گیم برد و انتخاب بهترین حرکت برای اولین حرکت2- امتیازدهی به حرکت انتخاب‌شده3- پیش‌بینی زمین بازی بعد از انجام آن حرکت و امتیازدهی به حالت‌های ممکن4- انتخاب بدترین حالت زمین برای ادامهاین کارها را آن‌قدر تکرار می‌کند تا به دستاوردهای لازم بازی برسد و ببرد.# Define the evaluation function to assess the desirability of a game state
def evaluate_board(board):
    # Your evaluation function implementation goes here
    # This function should assess the desirability of the current game state

# Define the minimax algorithm to find the best move
def minimax(board, depth, maximizing_player):
    if depth == 0 or game_over(board):
        return evaluate_board(board)
    
     if maximizing_player:
        max_eval = -math.inf
        for move in possible_moves(board):
            eval = minimax(move, depth - 1, False)
            max_eval = max(max_eval, eval)
        return max_eval
    else:
        min_eval = math.inf
        for move in possible_moves(board):
            eval = minimax(move, depth - 1, True)
            min_eval = min(min_eval, eval)
        return min_eval

# Define a function to make the best move using the minimax algorithm
def make_best_move(board, depth):
    best_move = None
    best_eval = -math.inf
    for move in possible_moves(board):
        eval = minimax(move, depth, False)
        if eval &gt; best_eval:
            best_eval = eval
            best_move = move
    return best_moveالگوریتم‌های دیگری نیز برای حل این بازی وجود دارد. همچنین با ترکیب الگوریتم‌ها نیز می‌توان روش‌های بهینه‌ای ساخت. اما بین این سه الگوریتم، الگوریتم آخر بهینه‌تر است و بیشترین نتیجه را دارد.</description>
                <category>سارا افتخاری</category>
                <author>سارا افتخاری</author>
                <pubDate>Mon, 04 Dec 2023 22:44:24 +0330</pubDate>
            </item>
                    <item>
                <title>موتور بازی سازی Unity</title>
                <link>https://virgool.io/@sarabre26/unity-r3nyqg3ztixq</link>
                <description>در این مقاله قصد دارم به تاریخچه‌ی یونیتی، کاربردهای آن در صنایع گوناگون و چیستی آن بپردازم. اما قبل از آن بهتر است درباره چگونگی کارکرد یونیتی از پایه صحبت کنیم. به نوعی این مقاله به شما دیدی از ریشه‌ی یونیتی و زمینه‌های شغلی توسعه دهندگان آن می‌دهد.معنی real-time چیست؟اصطلاح real-time (بلادرنگ - به‌موقع) به سرعت پدیدار شدن یک عکس در صفحه یا به اصطلاح  رندر گرفتن آن استفاده می‌شود. به صورت کلی هدف این است که عکس‌ها آنقدر سریع پدیدار شوند که کاربر بدون هیچ درنگی و آزادانه بتواند با پروژه تعامل داشته باشد. اگر یک پروژه real-time باشد کاربر هیچ‌وقت به این فکر نمی‌کند که این تصاویر دائما در حال عوض شدن هستند و  به جای آن به محتوای پروژه فکر می‌کند.  موتور بازی‌سازی unity یکی از آن ابزارهایی است که برای افرادی که از آن برای ساخت پروژه‌هایشان استفاده می‌کنند و هم برای کاربران نهایی آن از real-time استفاده می‌شود.در گذشته کامپیوترها آنقدر قدرتمند نبودند تا صحنه‌های بصری با انواع نور و افکت‌های فیزیکی را بتوانند رندر بگیرند و حتی رندر گرفتن یک عکس ساده ممکن بود ساعت‌ها‍ و حتی رو‌زها طول بکشد. هرباری که خالقان می‌خواستند اثر خود را ببینند ساعت‌ها طول می‌کشید و تنظیم مجدد آن نیز بسیار هزینه‌بر و زمان‌بر بود و به همین دلیل خیلی از ایده‌هایی که می‌توانست کیفیت نهایی پروژه را بهبود ببخشد نادیده گرفته می‌شد.به این نوع رندرها رندرهای آفلاین گفته می‌شود که می‌توان از آن‌ها در صنعت فیلم‌سازی استفاده کرد؛ اما در صنعت‌های تعاملی مانند بازی‌سازی که کاربر توقع دارد آنچه را که می‌بیند کنترل کند کارایی ندارند. رشد این صنعت نیز بخاطر تقاضای کاربران برای تعامل اتفاق افتاد.امروزه ابزار real-time چگونه استفاده می‌شوند؟در دنیای امروزه unity از واقعیت فراتر رفته است و می‌تواند نور و افکت‌های واقعی را کاملا صحیح ارائه کند و همچنین از فیزیک استفاده کند. در دنیای امروزه اگر پروژه‌ای از تعاملات دنیای واقعی دور شود تصمیم طراح آن این بوده است، نه محدودیت ابزارهای موجود. شاید هنوز unity به کیفیت ابزارهای آفلاین نرسیده باشد اما این اتفاق زودتر از آنچه فکر کنید رخ خواهد داد.عکس از فیلم کوتاه The Heretic است که با یونیتی ساخته شده است. در این‌جا می‌توانید فیلم را به صورت کامل ببینید.اگر یک پروژه نیازمند کیفیت بسیار خاص و بالایی باشد از ابزارهای آفلاین استفاده می‌شود. در غیر این صورت مزایای حذف این ابزارها بسیار بالا است. سازندگانی که پروژه های خود را به real-time انتقال می‌دهند روزها و ماه‌های زیادی را از چرخه‌ی تولید خود حذف می‌کنند و زمان بیشتری را برای آزمایش ایده‌های جدید خواهد داشت. به نوعی با این ابزارها سازندگان همه‌ی زمان خود را صرف تولید می‌کنند.موتور بازی سازی چیست؟فرآیند تولید بازی پیچیده‌تر از آنی است که به نظر می‌رسد. کامپیوتر یا موبایلی که شما این صفحه را در آن می‌خوانید سیستم‌عاملی را اجرا می‌کند که برق را به محتوای صفحه‌ی نمایش شما تبدیل می‌کند، روشنایی صفحه را مطابق با تنظیمات شما نگه می‌دارد و به اینترنت وصل می‌شود تا عکس یا متنی را به شما نشان دهد. همچنین، کارهای زیادی را هم‌زمان در پس‌زمینه انجام می‌دهد، مثل دسترسی دادن کامپیوتر به منبع انرژی آن. و همه‌ی این‌ها فقط برای نمایش یک عکس است.حال فکر کنید که می‌خواهید کاری بیشتر از نمایش یا خواندن انجام دهید، مثل نوشتن یک ایمیل. برای این کار تمرکز شما باید روی محتوا باشد، نه ساختار درونی ایمیل و اتفاقاتی که در پس‌زمینه‌ی آن می‌افتد. این دقیقا هدف موتور بازی است. موتور بازی‌سازی نقطه‌ی اتصالی برای تمام قطعات یک بازی است. بازی مانند تمام برنامه‌های دیگر از موارد کوچک‌تری مثل مدل‌های سه بعدی، فایل‌های صدا و کدها (scripts) تشکیل شده است که وقتی کنار هم قرار می‌گیرند، تجربه‌ی کاربری کاملی را تشکیل می‌دهند. موتور بازی سازی مانند unity نقطه‌ی اتصال تمام قطعات یک بازی استهمانند سیستم عامل، موتور بازی‌سازی نیز مطمئن می‌شود تا بازی شما به درستی در دستگاهی که انتخاب کرده‌اید اجرا شود. این شامل پخش تمام صداهای تعریف شده، تعامل داشتن اشیا با بقیه اشیا و ... است.با موتور بازی سازی چه کارهایی می‌توان انجام داد؟در موتور بازی‌سازی سازنده هر چیزی را که کاربر در محصول نهایی تجربه می‌کند، کنار هم قرار می‌دهد. اگر محصول نهایی یک بازی است، سازنده Game play آن را - مانند پریدن بر روی اشیا مختلف - طراحی می‌کند. اگر محصول نهایی واقعیت مجازی است، سازنده محیطی را که کاربر در آن قدم می‌زند طراحی می‌کند.موتور بازی‌سازی به سازندگان این امکان را می‌دهد تا محصول را به یک تجربه‌ی تعاملی تبدیل کنند. خیلی چیزهای بیشتری وجود دارد که unity آن‌ها در پس‌زمینه انجام می‌دهد تا تمرکز توسعه‌دهندگان بر روی تجربه‌ی کاربری باقی بماند.چه کارهایی را نمی‌توان با موتور بازی‌سازی انجام داد؟در موتور بازی‌سازی شما asset های (اشیاء و  صداهایی که از اصلی ترین قسمت های تجربه کاربری هستند) مورد نظرتان را نمی‌سازید. به آیتم‌هایی که در بازی یا پروژه‌ی خود استفاده می‌کنید Asset گفته می‌شود. این فایل‌ها ممکن است خارج از یونیتی ساخته شده باشند، مانند مدل‌های سه‌بعدی، فایل‌های صدا، عکس‌ها و یا هر نوع فایل دیگری که یونیتی از آن پشتیبانی می‌کند.این فایل‌ها در ابزارهای خارجی تخصصی که اصطلاحا به آن‌ها Digital Content Creation (DCC) یا ابزارهای ایجاد محتوای دیجیتال گفته می‌شود ساخته می‌شوند. بسیاری از این ابزارها توسط یونیتی پشتیبانی می‌شوند تا فرآیند وارد کردن آن‌ها به موتور بازی‌سازی ساده‌تر باشد.رایج‌ترین ابزارهایی که در تولید DCC ها استفاده می‌شود موارد زیر هستند:از 3D DCCs برای ایجاد مدل‌‌ها، کاراکترها و محیط‌های سه‌بعدی استفاده می‌شود، مانند Maya - ZBrush و Blenderاز 2D DCCs برای ایجاد تصاویر دوبعدی مانند عکس‌ها، طرح‌ها و رابط‌ها استفاده می‌شود، مانند Photoshop - illustrator و Gimpاز Audio DCCs برای ضبط، ویرایش و ترکیب صداها استفاده می‌شود، مانند Audition - Logic Pro و Audacityاز Integrated Development Environments (IDEs) برای کدنویسی به زبان‌های مختلف استفاده می‌شود، مانند Visual Studioو در نهایت از Real-time Engines برای توسعه، رندر و انتشار محتویات سه‌بعدی برنامه‌ها استفاده می‌شود، مانند Unity و Unrealداستان Unityاولین محصولی که با تکنولوژی unity منتشر شد موتور بازی سازی نبود، بلکه یک بازی بود.GooBall در سال ۲۰۰۵، بنیانگذاران یونیتی، یواخیم آنته، دیوید هلگاسون و نیکلاس فرانسیس، یک سال پس از تشکیل شرکت خود، بازی ویدیویی GooBall را برای MacOS منتشر کردند که در آن زمان Over the Edge Entertainment نام داشت.قبل از یونیتی بازی‌ها چگونه ساخته می‌شدند؟در آن زمان اکثر شرکت‌ها موتور بازی‌سازی خود را داشتند و گاهی برای هر بازی یک موتور مخصوص با توجه به مفاهیم بازی ساخته می‌شد. این بدین معنی است که اگر تغییری در مفهوم بازی ایجاد می‌شد هم بازی باید تغییر می‌کرد و هم موتور آن و برای انتشار یک بازی زمان بسیار زیادی صرف می‌شد.برای تیم‌های کوچک یا انفرادی که می‌خواستند بازی خود را تولید کنند داشتن موتور بازی‌سازی تقریبا ناممکن بود، چرا که ساخت یک موتور بازی‌سازی نیازمند تجربه‌ی زیاد در برنامه‌نویسی، دانش فنی بالا و زمان زیادی است. به همین دلیل تا اوایل دهه‌ی ۲۰۰۰ توسعه‌ی بازی‌های مستقل بسیار کم بود و از نظر تجاری این بازی‌ها به‌ندرت موفق بودند.تولد یک موتوربازی GooBall موفق نبود اما یونیتی چرا. این موتور اولین بار در کنفرانس جهانی توسعه‌دهندگان اپل به نمایش گذاشته شد. در ابتدا مورد استفاده‌ی افراد کمی قرار گرفت؛ اما بسیار سریع با استقبال توسعه‌دهندگان مستقل روبه‌رو شد.یونیتی در اواسط دهه‌ی ۲۰۰۰ وارد بازار شد، زمانی که چهره‌ی صنعت بازی‌سازی شروع به تغییر کرده بود. یونیتی به عنوان بخش مهمی از انقلاب بازی‌های مستقل قرار داشت.زمانی که یونیتی برای اولین بار ارائه شد، دو ویژگی مثبت داشت که آن را از دیگر موتورها متمایز می‌کرد.اول این که این موتور قیمت مقرون به صرفه‌ای داشت و دوم این که تمرکز خود را بر روی ایجاد تجربه‌ی خوب توسعه‌دهندگان نیز گذاشته بود.چه صنعت هایی از Unity استفاده می‌کنند؟ (app)یونیتی فقط مخصوص یک صنعت نیست، هر صنعتی که بخواهد محتوایی قابل تعامل تولید کند می‌تواند از مزایای یونیتی استفاده کند.بازییونیتی برای ساخت هزاران بازی در بیست پلتفرم مختلف ساخته شده است. حدود نیمی از بازی‌هایی که در کامپیوتر، کنسول، اندروید و ... انجام می‌دهید و حدود ۶۰ درصد از بازی های XR (واقعیت افزوده، مجازی و ترکیبی) توسط یونیتی ساخته شده‌اند. پس اگر شما از بازی کردن لذت می‌برید، احتمالا بازی‌ای که با یونیتی ساخته شده باشد را امتحان کرده‌اید. در اینجا چند نمونه از بازی‌های توسعه‌داده شده با یونیتی را می‌بینید.رسانه و سرگرمیرسانه و سرگرمی شامل صنعت‌های مختلف اما نزدیک به هم است، مانند فیلم، انیمیشن و تبلیغات و ... در این‌جا برخلاف بازی‌ها از یونیتی برای تولید محتوای غیرتعاملی استفاده می‌شود. به این معنی که ممکن است تماشاگران ندانند از یونیتی برای ساخت آن استفاده شده است؛ اما توسعه‌دهندگان مزایای یونیتی را به ابزارهای دیگر ترجیح داده‌اند و از قابلیت‌های بصری و انیمیشن‌های آن استفاده کرده‌اند.با یونیتی در زمان رندر صرفه جویی می‌شود و به استودیوها اجازه می‌دهد محتوایی با کیفیت بیشتر را در زمان کمتری انتشار دهند. همچنین قابلیت اکتشاف در محیط‌هایی مانند واقیت مجازی و واقعیت افزوده را به توسعه‌دهندگان می‌دهد. در سال ۲۰۱۹ بیشتر از ۶۵ درصد محتویات فستیوال ساندنس فیلم با یونیتی ساخته شده بود.در این فیلم درباره‌ی استفاده از یونیتی در این صنعت و همچنین همکاری دیزنی با آن‌ها توضیحات بیشتری داده شده است.معماری، مهندسی و ساخت‌و‌ساز (AEC)تقریبا تمام محیط‌های اطراف ما، از خانه‌ها گرفته تا اماکن عمومی، توسط فعالین این صنعت ساخته شده‌اند. با استفاده از یونیتی این امکان برای شرکت‌ها فراهم می‌شود تا طراحی‌های سنتی و تکنیک‌های ساختمانی را با تکنولوژی ترکیب کنند و با سرعت بیشتر به طرحی ایمن‌تر بسازند. یکی از کاربرد‌های محسوس آن، تجسم محیط‌های سه‌بعدی قبل از ساخته شدن آن‌هاست تا بتوان جزئیات واقعی آن‌ها را دید. استفاده از XR حتی می‌تواند تصاویر واقعی‌تری به ما نشان بدهد.در این فیلم مورتنسون، عضو یکی از شرکت های AEC که امروز از Unity استفاده می‌کند در این‌باره صحبت‌های بیشتری می‌کند.خودرو، حمل‌ونقل و تولید (ATM)از ده تولیدکننده‌ی بزرگ خودرو هشت نفر از آن‌ها از یونیتی استفاده می‌کنند. یونیتی کاربردهای مختلفی برای آن‌ها دارد و هزینه‌های تولید را کاهش می‌دهد. مهندسان ساخت خودرو، از واقعیت افزوده برای ساخت طرح‌های محصول استفاده می‌کنند. همچنین برای بازاریابان این امکان فراهم می‌شود تا بتوانند ماشین‌های سفارشی مختلف را به مشتریان خود در محیط‌های مختلف نشان بدهند. در این فیلم درباره‌ی کاربرد یونیتی در صنعت خودرو توضیحات بیشتری داده شده است.از این موتور بازی‌سازی برای برنامه‌های دیگر نیز استفاده می‌شود. از مزایای آن می‌توان به موارد زیر اشاره کرد:محتوای تعاملی به راحت‌ترین روش‌ها ساخته می‌شودمحصول نهایی را همیشه می‌بینیدمجددا از محتواهای ساخته‌شده در پروژه های دیگر استفاده می‌کنیدهمکاری آسان‌تری با اعضای تیم داریدبهترین راه برای یادگیری، تجربه‌ی آن بطور شخصی است. در این لینک می‌توانید پنج کاربرد مختلف آن را در صنعت ببینید. این‌ها نمونه‌های کوچکی هستند اما می‌توانند کاربردهای واقعی یونیتی را به شما نشان دهند.سارا برادران افتخاریدکتر مریم حاجی اسمعیلی. دکترای علوم کامپیوتر از دانشگاه کینگستون لندنDr.Maryam HajiesmaeiliPhD of computer science from Kingston university of Londonhttps://ir.linkedin.com/in/dr-maryam-hajiesmaeili-90930743منابعhttps://learn.unity.com/tutorial/what-is-real-timehttps://learn.unity.com/tutorial/what-is-unityhttps://unity3d.com/quick-guide-to-unity-asset-storehttps://learn.unity.com/tutorial/what-can-unity-do</description>
                <category>سارا افتخاری</category>
                <author>سارا افتخاری</author>
                <pubDate>Mon, 20 Jun 2022 14:40:38 +0430</pubDate>
            </item>
                    <item>
                <title>اتصال یونیتی به MySQL</title>
                <link>https://virgool.io/@sarabre26/%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-%D8%A8%D9%87-mysql-f6g5dzmiwnkx</link>
                <description>موتور یونیتی برای ساخت بازی‌های ویدیویی هست و زبان MySQL برای مدیریت داده‌ها استفاده می‌شود. شاید این دو در نگاه اول هیچ هدف مشترکی نداشته باشند، اما اگر دقیق‌تر بخواهیم نگاه کنیم برای ساخت بازی‌های آنلاین ما نیازمند هردوی آن‌ها هستیم. در این مقاله مسیری که برای اتصال یونیتی به پایگاه داده استفاده کرده‌ام را بازگو می‌کنم.با توجه به قابلیت‌های فراوان زبان c#، در ابتدا تلاش کردم تا بدون استفاده از زبان تحت سرور موتور یونیتی را مستقیما به پایگاه داده وصل کنم.  برای تلاش اول از این لینک استفاده کردم. برای این کار باید از پکیج اتصال یونیتی به MySQL استفاده کنیم، که به خطای زیر برخورد کردم:ارور اضافه کردن پکیج به پروژهبرای حل این ارور راه‌حل‌هایی موجود هستند هیچ‌کدام برای من پاسخگو نبودند. طبق پرس‌و‌جوهایی که داشتم به این نتیجه رسیدم که این ارور احتمالا بخاطر نصب اشتباه یونیتی و تحریم‌ها بوده است. همچنین یکی دیگر از مسیرهای پیشنهادی برای اتصال به پایگاه داده بدون استفاده از زبان PHP و دیگر زبان‌های تحت سرور استفاده از کتابخانه اتصال یونیتی به MySQL بوده است که در این لینک پیشنهاد شده است، که متاسفانه در این راه نیز خطاهای بسیاری بوجود آمدند.در انتها از زبان PHP برای اتصال استفاده کردم. در این راه از طریق کد سی‌شارپ فایل PHP فراخوانی می‌شود و اطلاعات لازم از طریق GET به آن داده می‌شود. فایل PHP به ساختمان داده‌ی ما متصل می‌شود و اطلاعات را می‌فرستد و یا دریافت می‌کند.در ادامه‌ی این نوشته، به ساخت بازی‌ای می‌پردازیم که در آن نام کاربری و بالاترین امتیاز هر فرد را از طریق یونیتی در پایگاه داده ثبت می‌شود و  بعد با فشار دادن دکمه‌ی «تنظیم مجدد» بالاترین پنج امتیاز را نشان می‌دهد.در این بازی از WampServer برای تبدیل سیستم خود به یک سرور داخلی و از PHPMyAdmin برای ساخت پایگاه داده استفاده می‌کنیم. از زبان PHP برای اسکریپت‌های سرور و از موتور یونیتی و زبان سی‌شارپ برای ساخت بازی استفاده می‌کنیم.ساخت پایگاه دادهومپ سرور را روی سیستم خود نصب کنید. برای نصب آن می‌توانید از این لینک کمک بگیرید. بعد از نصب آن را فعال کنید و به PhpMyAdmin بروید. یک پایگاه داده با نام دلخواه ایجاد کنید.ساخت پایگاه دادهدر تب SQL در PhpMyAdmin میتوانید از طریق کد جدول‌ها را بسازید، اطلاعات اضافه کنید، حذف کنید یا تغییر دهید. جدولی به نام highscore ایجاد می‌کنید که دو ستون &quot;اسم&quot; و &quot;بالاترین امتیاز&quot; دارد.CREATE TABLE highscore (
name VARCHAR(15) NOT NULL DEFAULT &#039;anonymous&#039;,
score INT(10) UNSIGNED NOT NULL DEFAULT 0
);شما می‌توانید از طریق رابط‌کاربری PHPMyAdmin نیز جدول‌های خود را ایجاد کنیدساخت جدول بالاترین امتیاز و ایجاد ستون‌های آنپیشنهاد می‌شود برای تست کردن اپلیکیشن اطلاعاتی را در همین ابتدا وارد آن کنید. در این صورت، راحت‌تر می‌توانید بازی را در یونیتی تست کنید. پس اگر اطلاعاتی از قبل دارید به این صورت در جدول بالاترین امتیاز آن‌ها را ثبت کنید.INSERT INTO scores (name, score) VALUES (&#039;John&#039;, 100),(&#039;Sally&#039;, 110), (&#039;Phil&#039;, 90), (&#039;Katy&#039;, 130), (&#039;Jack&#039;, 150)حال که پایگاه داده‌ی ما تنظیم شده است، زمان آن است که از طریق کد PHP پل ارتباطی بین یونیتی و پایگاه داده ایجاد کنیم. از طریق این کد ما بر روی پایگاه داده می‌نویسیم و همچنین داده‌ها را می‌خوانیم.کد‌های سمت سرور - display.phpدر پوشه‌ی سرور (اگر از ومپ استفاده میکنید در پوشه www) پوشه‌ای به نام HighScoreGame  برای مرتب‌سازی کد‌ها ایجاد می‌کنیم. سپس فایلی با فرمت PHP به نام display ایجاد می‌کنیم. فایل را می‌توانید از طریق نرم‌افزار هایی مثل Notepad++ ، PhpMyStorm و ... باز کنید و کد پایین را در آن کپی کنید. با توجه به تنظیمات خود مقادیر &quot;hostname&quot; , &quot;username &quot; و &quot;password&quot; را عوض کنید.&lt;?php

$servername = &amp;quotlocalhost&amp;quot
$username = &amp;quotroot&amp;quot
$password = &amp;quot&amp;quot
$dbname = &amp;quotunity_with_mysql&amp;quot

try {
$conn = new PDO(&amp;quotmysql:host=$servername;dbname=$dbname&amp;quot, $username, $password);
$conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
catch(PDOException $e) 
{
echo &amp;quotConnection failed: &amp;quot . $e-&gt;getMessage();
}

$sth = $conn-&gt;query(&#039;SELECT * FROM highscore ORDER BY highscore DESC LIMIT 5&#039;);
$sth-&gt;setFetchMode(PDO::FETCH_ASSOC);
$result = $sth-&gt;fetchAll();
if (count($result) &gt; 0
{
        foreach($result as $r)
        {
                echo $r[&#039;username&#039;], &amp;quot\n _&amp;quot
                echo $r[&#039;highscore&#039;], &amp;quot\n _&amp;quot
        }
}

?&gt;این اسکریپت در مجموع، ساده است. در اول کد، اتصالی به پایگاه داده ایجاد می‌شود که اگر با خطا مواجه شود پیام &quot;Connection failed&quot; به همرار ارور آن نمایش داده می‌شود.سپس در متغیر sth دستور SQL ای که برای انتخاب ۵ نفر با بالاترین امتیاز در جدول هست بر روی متغیر اتصال به پایگاه داده فراخوانی می‌شود. (این دستور SQL اجرا می‌‌شود.) نتیجه‌ی دستور sql را بر اساس مود &quot;FETCH_ASSOC&quot; می‌گیرد و با کمک دستور foreach اسم و امتیاز آن‌ها را چاپ می‌کند. پس با کمک این فایل ما نام و امتیاز ۵ نفر برتر را می‌گیریم و نمایش می‌دهیم.کد‌های سمت سرور - addscore.phpنام فایل بعدی کدهای سمت سرور addscore است. همان‌طور که از اسم آن مشخص است، با استفاده از این فایل امتیاز نفرات جدید را می‌گیریم و به پایگاه‌داده اضافه می‌کنیم. تمامی داده‌هایی که این فایل به پایگاه داده اضافه می‌کند از یونیتی سرچشمه می‌گیرند. مجددا در این فایل مقادیر متغیرها را با تنظیمات خود مطابقت دهید.فراموش نکنید مقدار secretkey باید با مقداری که در یونیتی برای آن می‌گذارید مطابقت داشته باشد. این مقدار می‌تواند هرچیزی که دوست دارید باشد. اگر این مقدار مطابقت نداشته باشد مقادیر شما در پایگاه داده ثبت نمی‌شود.&lt;?php

$servername = &amp;quotlocalhost&amp;quot
$username = &amp;quotroot&amp;quot
$password = &amp;quot&amp;quot 
$dbname = &amp;quotunity_with_mysql&amp;quot
$secretKey = &amp;quot2003&amp;quot

try {
        $conn = new PDO(&amp;quotmysql:host=$servername;dbname=$dbname&amp;quot, $username,         
        $password);

        $conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
catch(PDOException $e)
{
        echo &amp;quotConnection failed: &amp;quot . $e-&gt;getMessage();
}

$hash = $_GET[&#039;hash&#039;];
$realHash = hash(&#039;sha256&#039;, $_GET[&#039;name&#039;] . $_GET[&#039;score&#039;] . $secretKey);

if($realHash == $hash)
{
        $sth = $conn-&gt;prepare(&#039;INSERT INTO highscore VALUES (null, :username,:highscore)&#039;);
        try
        {
                $sth-&gt;bindParam(&#039;:username&#039;, $_GET[&#039;name&#039;], PDO::PARAM_STR);
                $sth-&gt;bindParam(&#039;:highscore&#039;, $_GET[&#039;score&#039;], PDO::PARAM_INT);
                $sth-&gt;execute();
        }
        catch(Exception $e)
        {
        echo &#039;&lt;h1&gt;An error has ocurred.&lt;/h1&gt;&lt;pre&gt;&#039;,
        $e-&gt;getMessage() ,&#039;&lt;/pre&gt;&#039;;
        }
}
?&gt;برای مرتب نگه داشتن، مطمئن شوید این فایل در پوشه‌ی مخصوص و در کنار فایل display.php است.مجددا در این کد اتصالی به پایگاه داده با استفاده از مقدارهایی که برای متغیرهای نام کاربری، نام پایگاه داده و رمز عبور گذاشته‌اید ایجاد می‌کنیم. از $_GET برای گرفتن پارامترهایی که از سمت کلاینت (کاربر) فرستاده شده است استفاده می‌کنیم. هم‌چنین از تابع hash برای رمزنگاری اطلاعات استفاده می‌کنیم تا امنیت اطلاعات افزایش یابد.در کد بالا برای صحت‌سنجی اطلاعات ما مجددا هش را تولید می‌کنیم تا مطمئن شویم اطلاعات فرستاده شده درست هستند. درصورتی که این دو مطابقت داشته باشند، با استفاده از prepare دستور SQL را آماده‌ی اجرا می‌کند و در صورتی که با خطا مواجه نشود (با استفاده از try catch) نام و امتیاز کاربر را در کد SQL قرار می‌دهد و  آن را اجرا می‌کند. در صورت مواجهه با خطا، پیام خطا چاپ می‌شود.حال زمان آن رسیده است که موتور یونیتی را باز کنید و شروع به ساخت برنامه‌ کنید.یونیتی - رابط کاربریزمان آن رسیده تا با استفاده از یونیتی اپلیکیشن را بسازیم. از یونیتی برای طراحی رابط کاربری آن استفاده می‌کنیم. منظور از رابط کاربری چیدمان دکمه‌ها، فیلدها و متونی است که استفاده می‌شوند. با ایجاد یک پروژه جدید در یونیتی شروع می‌کنیم.ایجاد یک پروژه جدید در یونیتیهر کدام از قالب ها در این پروژه قابل استفاده هستند. اما در این مثال ما از قالب سه‌بعدی استفاده می‌کنیم. محل ذخیره‌سازی پروژه را انتخاب می‌کنیم و دکمه &quot;create&quot; را می‌زنیم.انتخاب قالب سه‌بعدیحال شروع به ایجاد رابط کاربری می‌کنیم.  رابط کاربری این پروژه شامل ۹ المان است. دکمه‌ی &quot;submit&quot; برای اضافه کردن اطلاعات به جدول و دکمه &quot;Reset&quot; برای نمایش اطلاعات جدول در دو برچسب &quot;players&quot; و &quot;scores&quot; هست. از دو فیلد برای نوشتن نام کاربری جدید و امتیاز آن استفاده می‌کنیم. هم‌چنین از سه برچسب دیگر برای اطلاعات فیلد‌ها و فرم استفاده می‌کنیم. با کلیک راست بر روی قسمت Hierarchy (در چیدمان پیش‌فرض، این بخش در قسمت چپ پنجره قرار دارد) در زیرگروه UI که انواع المان‌های رابط کاربری در آن موجود هستند، ۹ المان مورد نظر را به پروژه اضافه می‌کنیم. این المان‌ها برای رابط کاربری از نوع &quot;text&quot; ، &quot;button&quot; و &quot;input field&quot; هستند.با استفاده از ۶ ابزاری که در نوار ابزار این برنامه قرار دارد، می‌توانید اندازه و موقعیت این اشیاء را تغییر دهید. همچنین با استفاده از میانبر های &quot;Q&quot; , &quot;W&quot; , &quot;E&quot; , &quot;R&quot; , &quot;T&quot; , &quot;Y&quot; به این ابزار دسترسی دارید.رابط کاربری دلخواه خود را بچینیدیونیتی - HighScoreControl.csاز طریق کلیک کردن در صفحه و انتخاب گزینه create و C# script یک فایل اسکریپت به نام HighScoreControl ایجاد کنید و فایل را در ادیتور باز کنید. این اسکریپت مسئول ارسال و دریافت اطلاعات از پایگاه داده است. از بین این دو، گرفتن امتیاز‌ها از پایگاه داده کار آسان‌تری است که به وسیله ارسال یک HTTP از طریق UnityWebReguest انجام می‌شود. در روند انجام این کار کد display.php به ما کمک می‌کند.اسکریپت سمت سرور اجرا می‌شود و اطلاعات را به یونیتی می‌فرستد. س‍‍پس یونیتی آن را در رابط کاربری نمایش می‌دهد.ارسال اطلاعات از الگویی مشابه پیروی می‌کند اما لازم است شما از تابع POST برای ارسال اطلاعات با فایل addscore.php استفاده کنید. البته همان‌طور که در بالا اشاره شد، قبل از ارسال اطلاعات آنها را رمزنگاری می‌کنیم تا در سمت سرور صحت آن‌ها سنجیده شود. در دنیای واقعی برای امنیت اطلاعات باید کارهای بیشتری انجام شود. اما برای هدف این مثال در این حد کافی است و تلاش می‌کنیم روند را ساده نگه داریم. پس از این که اطلاعات از طریق درخواست HTTP ارسال شدند فایل addscore.php بقیه روند اضافه کردن اطلاعات را مدیریت می‌کند.برای این که کد ما به درستی کار کند نیاز است فضای نامی‌هایی که از آن استفاده شده است را صدا کنید.using System;
using System.Collections;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;در کلاس HighScoreControl متغیر های زیر را تعریف و آن‌ها را مقداردهی می‌کنیم.private string secretKey = &amp;quot2003&amp;quot
public string addScoreURL =&amp;quothttp://localhost/HighScoreGame/addscore.php?&amp;quot
public string highscoreURL =&amp;quothttp://localhost/HighScoreGame/display.php?&amp;quot
public Text nameTextInput;
public Text scoreTextInput;
public Text nameResultText;
public Text scoreResultText;مقدار متغیر secretKey  باید با مقدار آن در addscore.php تطابق داشته باشد. حواستان باشد آن‌ها کاملا یکسان باشند.همین‌طور دو آدرس URL مسیری است که کدهای سمت سرور در آن‌جا هستند و یونیتی اطلاعات را از آن می‌خواند و به آن ارسال میکنددر نهایت 4 برچسب در این کد تعریف شده‌اند که برای نمایش اطلاعات در رابط کاربری استفاده می‌شوند.در یونیتی coroutines توابعی هستند که می‌توان اجرای آن‌ها را متوقف کرد و از خروجای آن‌ها تا آن زمان استفاده کرد، سپس دوباره از همان‌جا که توقف کرده است به اجرا ادامه دهد.در ادامه کد نیازمند دو تابع هستیم، یکی برای ارسال داده‌ها و دیگری برای دریافت آن‌ها. این توابع در رابط کاربری به دکمه‌های شما نسبت داده می‌شوند که در ادامه خواهید دید و برچسب‌ها را به مقدار پیش‌فرض خود تغییر می‌دهند.public void GetScoreBtn()
{
        nameResultText.text = &amp;quotPlayer: \n \n&amp;quot
        scoreResultText.text = &amp;quotScore: \n \n&amp;quot
        StartCoroutine(GetScores());
}
public void SendScoreBtn()
{
        StartCoroutine(PostScores(nameTextInput.text,
        Convert.ToInt32(scoreTextInput.text)));
        nameTextInput.gameObject.transform.parent.GetComponent&lt;InputField&gt;().text = &amp;quot&amp;quot
        scoreTextInput.gameObject.transform.parent.GetComponent&lt;InputField&gt;().text = &amp;quot&amp;quot
}صحبت از کوروتین‌ها شد، حال زمان مناسبی است که اولین کوروتین به نام GetScores را ایجاد کنیم. همان‌طور که از نام آن مشخص است، این تابع مسئول بازیابی ۵ امتیاز اول همراه با نام آن‌ها از  پایگاه داده است. همان‌گونه که قبلا گفته شد این تابع یک درخواست HTTP ارسال می‌کند تا با فایل display.php ارتباط برقرار کند و کد sql در پایگاه داده اجرا شود.در کد display.php به ازای هر نام و امتیاز یک &quot;_&quot; چاپ می‌کند و در تابع GetScores در یونیتی با استفاده از همین علامت آن‌ها را از هم جدا می‌کنیم و در برچسب های &quot; nameResultText&quot; و &quot;scoreResultText&quot; چاپ می‌کنیم.IEnumerator GetScores()
{
        UnityWebRequest hs_get = UnityWebRequest.Get(highscoreURL);
        yield return hs_get.SendWebRequest();
        if (hs_get.error != null)
                Debug.Log(&amp;quotThere was an error getting the high score: &amp;quot+ hs_get.error);
        else
        {
                string dataText = hs_get.downloadHandler.text;
                MatchCollection mc = Regex.Matches(dataText, @&amp;quot_&amp;quot);
                if (mc.Count &gt; 0)
                {
                        string[] splitData = Regex.Split(dataText, @&amp;quot_&amp;quot);
                        for (int i =0; i &lt; mc.Count; i++)
                         {
                                if (i % 2 == 0)
                                        nameResultText.text +=splitData[i];
                                else
                                        scoreResultText.text +=splitData[i];
                           }
                }
        }
}قدم بعدی کوروتین PostScores است که ارسال امتیاز و نام کاربر را مدیریت می‌کند. این تابع دو پارامتر دارد. اول بر اساس نام کاربری و امتیاز و کلید، آن‌ها را هش می‌کند تا بتوان آن‌ها را در سمت سرور صحت‌سنجی کرد. بعد از طریق HTTP یک درخواست ارسال می‌شود تا اطلاعات از طریق addscore.php در پایگاه داده اضافه شوند. ادامه‌ی کار را فایل سرور مدیریت می‌کند که در بالا به آن اشاره کردیم.IEnumerator PostScores(string name, int score)
{
        string hash = HashInput(name + score + secretKey);
        string post_url = addScoreURL + &amp;quotname=&amp;quot + UnityWebRequest.EscapeURL(name) +                 
        &amp;quot&amp;score=&amp;quot+ score + &amp;quot&amp;hash=&amp;quot + hash;
        UnityWebRequest hs_post = UnityWebRequest.Post(post_url, hash);
        yield return hs_post.SendWebRequest();
        if (hs_post.error != null)
                Debug.Log(&amp;quotThere was an error posting the high score: &amp;quot+ hs_post.error);
}تابع PostScores از طریق تابع HasInput اطلاعات را هش می‌کند اما هنور این تابع نوشته نشده است پس با نوشتن این تابع فایل اسکریپت را کامل می‌کنیم. کاری که این تابع انجام می‌دهد این است که یک رشته بر اساس نام کاربری و امتیاز و کلید مخفی می‌گیرد و آن را بر اساس الگوریتم SHA256 هش می‌کند. خروجی این تابع به سمت سرور ارسال می‌شود.public string HashInput(string input)
{
        SHA256Managed hm = new SHA256Managed();
        byte[] hashValue = hm.ComputeHash(System.Text.Encoding.ASCII.GetBytes(input));
        string hash_convert = BitConverter.ToString(hashValue).Replace(&amp;quot-&amp;quot, &amp;quot&amp;quot).ToLower();
        return hash_convert;
}حال فایل HighScoreControl.cs کامل است. اطمینان حاصل کنید که آن را ذخیره کرده‌اید و به ادیتور یونیتی برگردید.یونیتی - اتمام پروژهکد HighScoreControl.cs را به عنوان component به دوربین اصلی بدهید.نسبت دهی کد به main cameraمطمئن شوید تمام زیرگروه های canvas باز است تا آن‌ها را به component اسکریپت در دوربین نسبت دهیم.حال نوبت آن است تا دکمه‌ها را فعال کنیم. submit-btn را انتخاب کنید و به کامپوننت button بروید و تابع SendScoreButton را به آن نسبت بدهید. برای انجام این کار در قسمت زیر بر روی دکمه + کلیک کنید تا یک رویداد به آن اضافه کنید.اضافه کردن رویداد به  دکمه هاسپس دوربین را به عنوان شئ به قسمت زیر بکشید. دلیل استفاده از دوربین این است که کد به این شئ نسبت داده شده است.بر روی منوی no function کلیک کنید تا تابع SendScoreButton را از آنجا صدا بزنیم.انتخاب رویداد در هنگام کلیک بر روی دکمه از کد های دوربینمجددا این کار را برای دکمه Reset نیز تکرار کنید و از تابع GetScoreBtn استفاده کنید.مشخصات نهایی دکمه هابعد از اتمام تمام این‌ها از دکمه‌ی play که در بالا و وسط نوار ابزار قرار دارد می‌توانید برای تست بازی خود استفاده کنید. تست را با این شروع کنید که می‌توانید اطلاعات را بخوانید و بعد مشخصاتی را به آن اضافه کنید و مجددا اطلاعات را بخوانید. پروژه‌ی شما کامل است.شما می‌توانید دانش خود را با تجربه‌هایی از این قبیل، افزایش تعداد جدول‌ها و ذخیره‌سازی داده‌های مختلف افزایش دهید. برنامه را تغییر دهید و برای خود پروژه‌های جدید با خلاقیت و هوشمندی به وجود بیارید.سارا برادران افتخاریدکتر مریم حاجی اسمعیلی. دکترای علوم کامپیوتر از دانشگاه کینگستون لندنDr.Maryam HajiesmaeiliPhD of computer science from Kingston university of Londonhttps://ir.linkedin.com/in/dr-maryam-hajiesmaeili-90930743منابع: https://www.w3schools.comhttps://www.php.nethttps://www.red-gate.comhttps://docs.microsoft.comhttps://forum.unity.comhttps://www.mono-project.comhttps://stackoverflow.com</description>
                <category>سارا افتخاری</category>
                <author>سارا افتخاری</author>
                <pubDate>Sat, 02 Apr 2022 13:19:47 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش برنامه‌نویسی پایه _ بخش 1</title>
                <link>https://virgool.io/@sarabre26/teachbasic1-idwcgq6nuahy</link>
                <description>در این مطلب و ادامه‌ی آن قصد دارم برنامه‌نویسی و بازی‌سازی را از پایه به شما آموزش بدهم. این آموزش حاصل تجربیات چندین سال شخصی‌ام در این مسیر است. شاید این راه برای شما سخت باشد و قصد دارم با این مطالب مسیر را کمی هموار‌تر کنم. اگر قصد دارید به شخصی آموزش بدهید یا آموزش ببینید این مطلب و در ادامه بقیه‌ی آموزش ها احتمالا برای شما مفید هستند. در این سری از مطالب از الگوریتم و فلوچارت و زبان بیسیک شروع کرده، و در ادامه به آموزش زبان C# می‌پردازیم و بعد از آن با موتور یونیتی آشنا می‌شویم. ‌در برنامه‌نویسی نیز مانند زندگی روزمره، همیشه با مسائلی حل‌نشده روبه‌رو هستیم که نیازمند راه‌حل هستند و اساس برنامه‌نویسی نیز همین است، «پیدا کردن راه‌حل». اما قبل از پیدا کردن راه حل، ما باید به یک شناخت مناسب از مساله برسیم و  آن را بهتر را درک کنیم تا بتوانیم به بهترین راه‌حل برسیم.مراحل بالا به ترتیب برای پیدا کردن بهترین راه‌حلشناخت دقیقدر ابتدا فکر کنید که این مسئله چه اطلاعاتی به شما می‌دهد و چه چیزی از شما می‌خواهد، همچنین برای تبدیل اطلاعات به خروجی مورد نظر نیاز به چه پردازش‌هایی است. در اینجا بهتر است با چند اصطلاح آشنا شوید:سیستم (system): مجموعه‌ای از اجزای مختلف که معمولاً برای رسیدن به یک هدف با یکدیگر در ارتباط و تعامل هستند. هر سیستم دارای ورودی، خروجی و پردازش مشخصی است. ورودی (Input): داده هایی که توسط سیستم دریافت می‌شوند. خروجی (Output): سیگنال‌ها یا اطلاعاتی که سیستم آن‌ها را ارسال می‌کند. پردازش (process): مجموعه‌ی عملیاتی که بر روی داده‌های ورودی انجام می‌شود تا آن را به اطلاعات خروجی مد نظر تبدیل کند.داده (Data): مجموعه‌ای از اعداد، ارقام، نشانه‌ها و ... که هیچ گونه عملیاتی روی آن‌ها انجام نشده و اصطلاحا خام هستند.اطلاعات (Information): مجموعه‌ای از داده‌ها که طی عملیات‌های منطقی پردازش می‌گردند و تبدیل به اطلاعاتی می‌شوند که دانشی را به کاربر منتقل می‌نمایند.پس اطلاعات از داده‌های پردازش شده تشکیل شده است.برای درک بهتر این مفاهیم به مثال زیر توجه کنید:معلمی می‌خواهد میانگین نمرات کلاسش را حساب کند. ورودی او 30 نمره ای (داده) است که در دفترش از هر دانش‌آموز دارد. عملیاتی که انجام می‌دهد جمع و تقسیم اعداد است و در نهایت میانگین نمرات کلاس (اطلاعات) را به عنوان خروجی دارد.تمرین:داده، عملیات و اطلاعات را برای مثال های زیر بیان کنید1. محاسبه مساحت مستطیل به عرض و طول 2 و 42. سرعت ماشینی 20 کیلومتر بر ساعت است. سرعت آن بر حسب متر بر ثانیه چقدر است؟جواب تمرین‌های بالا در آخر این مطلب قابل مشاهده هستند.تجزیه و تحلیلدر مرحله‌ی دوم باید مسئله را برای خود تجزیه کنید. اگر مسئله قابل حل است و راه‌حل آن به ذهنتان می‌رسد به مرحله‌ی بعد بروید، اما اگر این‌طور نیست بهتر است آن را به مسئله‌های کوچک‌تری تبدیل کنید. اگر برای این ریزمسئله‌ها نیز جوابی پیدا نکردید مجددا آن‌ها را به مسائل کوچک‌تری تبدیل کنید.برای مثال اگر شما بخواهید یک ماشین بسازید، هیچ‌گاه نمی‌توانید آن را به صورت یکجا آماده کنید، بلکه باید آن را قطعات کوچک‌تری تقسیم کرده، آن ها را آماده و بعد قطعات را مونتاژ کنید.این در مسائل کوچک‌تر نیز قابل فهم است: اگر می‌خواهید میانگین نمره 30 دانش آموز را حساب کنید (مسئله)باید در مرحله اول 30 نمره را با هم جمع کنید (ریزمسئله اول)و سپس آن را تقسیم بر تعداد کنید (ریز مسئله دوم)تمرین:مسائل زیر را به ریزمسئله تبدیل کنید.3. محاسبه حجم یک مکعب مستطیل به ابعاد 2 ، 3 و 44. ساخت بازی Shoot Em Upجواب تمرین‌های بالا در آخر این مطلب قابل مشاهده هستند.طراحی راه‌حلدر این مرحله ما باید راه‌حل را طراحی کنیم و سپس آن را تبدیل به کد کنیم. خیلی وقت ها مسائلی که با آن‌ها رو‌به‌رو شده‌ایم قبلا توسط افراد دیگر حل شده‌اند. در این حالت شما به راحتی با سرچ کردن در اینترنت می‌توانید آنها را پیدا کنید و زمان خود را صرف بهبود آن کدها کنید. همچنین ممکن است در برنامه‌های قبلی‌ای که نوشته‌اید به این مسئله برخورد کرده باشید و بتوانید از آرشیو کدهای قدیمی خود استفاده کنید. (درباره‌ی استفاده از کدهای قدیمی، من در یکی از جشنواره‌های بازی‌سازی با فردی آشنا شدم که می‌گفت با استفاده از آرشیو بسیار قوی و مرتبی که از کدهای قبلی خود دارند توانستند یک بازی را از صفر تا صد در یک هفته بزنند، در صورتی که اگر از کد‌های آرشیو خود استفاده نمی‌کردند این پروسه دو یا سه ماه طول می‌کشید.)اما اگر در ابتدا راه هستید این راه اصلا پیشنهاد نمی‌شود، چون شما در این مرحله باید بتوانید خلاقیت خود را بالا برده و توانایی تفکر خود را افزایش دهید. پس بهتر است حداقل به تمامی مسائلی که برخورد می‌کنید یک ساعت فکر کنید و  بعد اگر راه‌حلی به ذهنتان نرسید سرچ کنید و ایده بگیرید، و البته کدها را کپی نکنید!زمانی که شما گمان می‌کنید به یک مانع بزرگ برخورد کرده‌اید دقیقا همان زمانی است که شما می‌توانید به موفقیت‌های بسیار زیادی دست پیدا کنید.حال اگر می‌خواهید خودتان مسئله را حل کنید، یا سرچ پاسخگو شما نبوده است، باید از تفکر منطقی استفاده کنید. منظور از تفکر منطقی سپری کردن تمام مراحل بالا و بعد به دنبال بهینه‌ترین راه‌حل بودن است. برای مسائل به این فکر کنید که آیا این راه‌حلی که پیدا کردید در تعداد بالا نیز پاسخگو است؟ آیا می‌توانم بعدا آن را تغییر دهم؟ آیا راه‌حل بهتری وجود ندارد؟ اگر این قسمت از عملیات را پاک کنم نتیجه فرقی می‌کند؟ و سوالاتی از این قبیل ...برای مثال به شما گفته‌اند تعداد اعداد زوج  از 1 تا 20 را حساب کنیددر ابتدا شاید شما تک تک اعداد زوج را پیدا کنید و بشمارید، اما آیا این روش در تعداد بالا نیز کارآمد هست؟ پس از نظر منطقی به آن نگاه کنید. در اعداد به ترتیب از هر دو عدد یکی از آن‌ها زوج است، پس در بیست عدد ده عدد زوج وجود دارد.تا به این‌جا با برخوردی که با مسائل در نگاه اول باید داشته باشیم آشنا شدیم. اگر از این اصول در تمامی برنامه‌هاتون استفاده کنید، تضمین می‌کنم که کار برای شما بسیار آسان تر خواهد شد و سرعت پیشرفت بیشتری داشته باشید.در بخش بعدی با الگوریتم و مفاهیم و شروط آن آشنا می‌شویم.پاسخ تمرین ها:1. داده ها = 2 و 4    عملیات = ضرب این دو برای محاسبه مساحت    اطلاعات = مقدار مساحت که برابر عدد 8 می‌شود2. داده ها = 20 کیلومتر بر ساعت    عملیات = تبدیل کیلومتر‌ بر‌ ساعت به متر‌ بر‌ ثانیه بر اساس فرمول دارد    اطلاعات = سرعت بر اساس متر‌ بر‌ ثانیه که با 5.555 برابر است3. ابتدا مساحت یک وجه مکعب را حساب کرده (ریزمسئله 1) بعد آن را در ارتفاع ضرب می‌کنیم تا حجم را به دست آوریم. (ریزمسئله 2)4. برای ساخت این بازی ما مکانیک‌های مختلف داریم. هر کدام از آن‌ها را حل می‌کنیم تا به کلیت بازی برسیم. مکانیک 1 = حرکت موشکمکانیک 2 = حرکت دشمن هامکانیک 3 = پرتاب تیر موشکمکانیک 4 = از بین رفتن دشمن هامکانیک آخر باخت یا برد</description>
                <category>سارا افتخاری</category>
                <author>سارا افتخاری</author>
                <pubDate>Fri, 01 Apr 2022 22:31:57 +0430</pubDate>
            </item>
            </channel>
</rss>