fbpx

【AI駆動開発】v0の対抗馬「Create」でUIデザイン+フロント実装までを全自動化! #AI #Create #v0 #ChatGPT

はじめに

【AI駆動開発】v0ならこんなに簡単!UIデザインからフロント実装までが爆速に!では、v0を利用してタイマーアプリのUIを作成し、生成されたコードに対して動作を実装していくチャレンジを行いました。

v0で生成されるコードはUI部分のみで、動作・挙動・処理に関する実装は自力で行う必要がありましたが、Createなら、v0と同様のUI作成に加えて動作の実装まで自動的に生成されます。

今回はCreateを使って、v0で作成したのと同じタイマーアプリを作成してみましょう。

CreateでタイマーアプリのUIを作成してみる

CreateではProjectを作成し、その中に複数のPageとComponentを作成することができます。

New Pageを押して新しいページの作成を開始します。

右側のプロンプト入力欄に、作成したい画面の仕様を記入します。表示されているヒントのとおり、小さなプロンプトから始めて徐々に増強していくことにします。最初に与えるプロンプトは「タイマー」です。入力してGenerateを押すと、10秒程度でそれなりのUIが作成されました。ここまではv0と同様です。

気に入らない場合は、右下にあるRetryボタンを押すこともできます。今回はこのまま進めることにします。

私が作りたかったのはカウントダウンするタイマーなので「時間を入力して、スタートするとカウントダウンする。」と入力して更新させてみます。10秒程度で指示通りのUIに更新されました。操作方法も生成結果もv0とほぼ同じです。

次は「時分秒の入力欄は個別に設ける」という指示を追加してみます。Generateを押すと指示通りの内容に更新されました。

ちなみにCreateではモバイル版も同時に対応されています。

ラベルはUI上から直接変更することができます。試しにボタンのラベルを日本語にしてみました。

ボタンなどのパーツを選択するとコンポーネントとして切り出すことができるようですが、これは別の機会にチャレンジすることにします。

UIの作成はここまでにしましょう。目的のものが1分程度で完成しました!

Createで生成されたコードを確認してみる

コードの画面に切り替えて、生成されたコードを確認してみましょう。

実際に生成されたコードは以下の通りです。

"use client";
import React from "react";

function MainComponent() {
  const [hours, setHours] = React.useState(0);
  const [minutes, setMinutes] = React.useState(0);
  const [seconds, setSeconds] = React.useState(0);
  const [intervalId, setIntervalId] = React.useState(null);

  const startTimer = () => {
    if (!intervalId) {
      const id = setInterval(() => {
        setSeconds((prevSeconds) => {
          if (prevSeconds === 0) {
            if (minutes === 0) {
              if (hours === 0) {
                clearInterval(id);
                setIntervalId(null);
                return 0;
              } else {
                setHours((prevHours) => prevHours - 1);
                setMinutes(59);
                return 59;
              }
            } else {
              setMinutes((prevMinutes) => prevMinutes - 1);
              return 59;
            }
          } else {
            return prevSeconds - 1;
          }
        });
      }, 1000);
      setIntervalId(id);
    }
  };

  const stopTimer = () => {
    if (intervalId) {
      clearInterval(intervalId);
      setIntervalId(null);
    }
  };

  const resetTimer = () => {
    stopTimer();
    setHours(0);
    setMinutes(0);
    setSeconds(0);
  };

  const handleHoursChange = (e) => {
    resetTimer();
    setHours(Math.max(0, e.target.value));
  };

  const handleMinutesChange = (e) => {
    resetTimer();
    setMinutes(Math.max(0, Math.min(59, e.target.value)));
  };

  const handleSecondsChange = (e) => {
    resetTimer();
    setSeconds(Math.max(0, Math.min(59, e.target.value)));
  };

  const formatTime = () => {
    return [hours, minutes, seconds]
      .map((v) => v.toString().padStart(2, "0"))
      .join(":");
  };

  return (
    <div className="flex flex-col items-center justify-center min-h-screen bg-[#f0f0f0]">
      <h1 className="text-4xl font-roboto mb-8 text-[#333]">タイマー</h1>
      <div className="flex space-x-2 justify-center mb-4">
        <input
          type="number"
          name="hoursInput"
          value={hours}
          className="w-20 p-2 border rounded text-center"
          placeholder="時"
          onChange={handleHoursChange}
        />
        <input
          type="number"
          name="minutesInput"
          value={minutes}
          className="w-20 p-2 border rounded text-center"
          placeholder="分"
          onChange={handleMinutesChange}
        />
        <input
          type="number"
          name="secondsInput"
          value={seconds}
          className="w-20 p-2 border rounded text-center"
          placeholder="秒"
          onChange={handleSecondsChange}
        />
      </div>
      <div className="bg-[#ffffff] shadow-lg rounded-lg overflow-hidden w-[350px]">
        <div className="p-8">
          <p className="text-2xl font-roboto text-center text-[#333]">
            {formatTime()}
          </p>
        </div>
        <div className="flex justify-between p-4 bg-[#eeeeee]">
          <button
            onClick={startTimer}
            className="bg-[#4caf50] text-white font-roboto p-2 rounded hover:bg-[#66bb6a] focus:outline-none transition duration-150 ease-in-out"
          >
            スタート
          </button>
          <button
            onClick={stopTimer}
            className="bg-[#f44336] text-white font-roboto p-2 rounded hover:bg-[#ef5350] focus:outline-none transition duration-150 ease-in-out"
          >
            ストップ
          </button>
          <button
            onClick={resetTimer}
            className="bg-[#ffca28] text-white font-roboto p-2 rounded hover:bg-[#ffca28] focus:outline-none transition duration-150 ease-in-out"
          >
            リセット
          </button>
        </div>
      </div>
    </div>
  );
}

export default MainComponent;

UIだけでなく、各ボタンが押された際の処理やタイマーのカウントダウン処理が実装されていることが分かります。また、時と分は0~59までしか入力できないようにする制限も実装されています。なお、v0とは異なり、直接コードを編集することはできません。

Createで生成されたコードの動作を確認してみる

ここまで来れば、生成されたコードをコピーして自分のプロジェクトへ貼り付けるだけです。その前に、Create上で実際の挙動を確認することができるので、試してみましょう。

完璧です。私はUIも挙動も一切コードを書くことなく、タイマーアプリを作成することができました!

まとめ

Createでもv0と同じように納得のいくUIを爆速で作成することができました。生成されたコードはタイマーの挙動まで実装されており、一切手を加えることないまま実際に問題なく動作しました。ここまでできるのであれば「UI作成支援ツール」というよりも「アプリ作成支援ツール」ということができるでしょう。今回のような簡単なアプリであれば「支援」どころか「全自動」で完成しました。

どんなに優れたエンジニアでも、実際に動くタイマーアプリをUIからゼロベースで作成するのに1分で完成させられる人はいないでしょう。想像以上の結果に驚きです。

v0・Create以外にもUI作成支援のAIは続々と登場しています。まだβ版や一般公開されていないものも多くありますが、これからの更なる進歩に期待しましょう!

Author

教育系エンジニア。開発やR&Dで最前線の技術を実践しつつ、後進の育成にも魂を燃やす。排出者は数千名。無類の子ども好きで、平日夕方は仕事を中抜けして近所の子どもと遊ぶ毎日。小学校でのプログラミング授業なども経験あり。

上村国慶の記事一覧

新規CTA