<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Marc Mintel</title>
    <description>The latest articles on Forem by Marc Mintel (@mmintel).</description>
    <link>https://forem.com/mmintel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F169858%2F04828f78-0a13-4a65-9901-a6534eea08ed.jpg</url>
      <title>Forem: Marc Mintel</title>
      <link>https://forem.com/mmintel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mmintel"/>
    <language>en</language>
    <item>
      <title>I created a whole macOS app with Flutter just using AI, here is my report</title>
      <dc:creator>Marc Mintel</dc:creator>
      <pubDate>Thu, 02 Jan 2025 10:59:42 +0000</pubDate>
      <link>https://forem.com/mmintel/i-created-a-whole-macos-app-with-flutter-just-using-ai-here-is-my-report-30b2</link>
      <guid>https://forem.com/mmintel/i-created-a-whole-macos-app-with-flutter-just-using-ai-here-is-my-report-30b2</guid>
      <description>&lt;h2&gt;
  
  
  Building My First MacOS App: 100% AI-Created Render Manager
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4nzbyfbn5zsk4bvrnu3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4nzbyfbn5zsk4bvrnu3b.png" alt="Image description" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the first time ever, I ventured into creating an app for MacOS, and the craziest part? It was entirely built by AI. I didn't write a single line of code myself. Of course, my background in software development was invaluable in guiding the process, but it’s absolutely insane what’s possible with AI today.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvtj5eu295wcm6ipyqzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvtj5eu295wcm6ipyqzi.png" alt="Image description" width="800" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why a Render Manager?
&lt;/h3&gt;

&lt;p&gt;Rendering complex 3D scenes in Blender is a demanding process, and existing render managers often lack the specific features or flexibility needed for personal workflows. As a Blender user on MacOS, I struggled to find a solution that integrated seamlessly with my tools, offered customizability, and streamlined rendering tasks. This app was born out of necessity, and its development highlights both the capabilities and limitations of AI-assisted programming.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the App
&lt;/h3&gt;

&lt;p&gt;The app is a render manager specifically made for MacOS. Why? Because I couldn’t find an existing solution that met my needs. Here’s what it does so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;📦 Drag and Drop&lt;/strong&gt;: Easily add Blender files to the render queue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔐 Blender Addon&lt;/strong&gt;: Integrates directly with Blender’s render menu for seamless file addition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔅 Configurable Settings&lt;/strong&gt;: Full control over render configurations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⏹ Mid-Process Stop&lt;/strong&gt;: Ability to halt rendering at any point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔧 Custom Output Paths&lt;/strong&gt;: Define output paths and naming patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔄 Auto Retry&lt;/strong&gt;: Retries failed renders automatically with customizable attempts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌐 Network Rendering&lt;/strong&gt;: Distribute workloads across multiple machines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🚀 TurboRender Support&lt;/strong&gt;: Compatibility with advanced features like Temporal Denoising.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📱 Telegram Integration&lt;/strong&gt;: Remote monitoring and control via Telegram.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚙️ Command-Line Parameters&lt;/strong&gt;: Support for custom Blender CLI commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🏠 Factory Settings&lt;/strong&gt;: A troubleshooting mode for resetting configurations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Scene Selection&lt;/strong&gt;: Select scenes and cameras per project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📁 Organized Outputs&lt;/strong&gt;: Flexible file organization using pattern variables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔍 Real-Time Monitoring&lt;/strong&gt;: Track render progress live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 Detailed Logs&lt;/strong&gt;: Comprehensive render logs and error reporting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎮 Frame Control&lt;/strong&gt;: Define start, end, and step values for frame ranges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎨 Multi-Scene Support&lt;/strong&gt;: Manage individual settings for multiple scenes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔄 Automatic Data Fetching&lt;/strong&gt;: Seamlessly retrieves scene data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📸 Camera Selection&lt;/strong&gt;: Choose cameras for specific scenes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxu2ifsbp9eru9f0etvw9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxu2ifsbp9eru9f0etvw9.png" alt="Image description" width="800" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Building with AI: Insights and Tips
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Patience Is Key
&lt;/h4&gt;

&lt;p&gt;Working with AI requires a lot of patience. It’s also not cheap—each request incurs a cost, and the AI often makes errors. Without version control like Git, the process would be chaotic. Sometimes, the AI replaces sections of code with placeholder comments, so reverting changes is critical. Using Git or similar tools is non-negotiable when relying heavily on AI-generated code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Splitting Tasks
&lt;/h4&gt;

&lt;p&gt;When working with AI, break down your tasks into small, manageable chunks. This minimizes misunderstandings and helps the AI focus on specific objectives. Restarting chats frequently to maintain instruction clarity also helps.&lt;/p&gt;

&lt;h4&gt;
  
  
  Debug Logs Are Crucial
&lt;/h4&gt;

&lt;p&gt;It’s essential to let AI create as many debug logs as possible. You’ll often find yourself copying logs into the AI to provide context for what went wrong. This iterative debugging process is vital for resolving issues efficiently.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where AI Excels
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Refactoring&lt;/strong&gt;: AI handles refactoring impressively well, turning messy code into clean, maintainable structures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Splitting&lt;/strong&gt;: Breaking down large files into smaller ones is essential for managing AI costs and reducing errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototyping&lt;/strong&gt;: Quickly generating boilerplate code or testing ideas is where AI shines.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Challenges
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instruction Fatigue&lt;/strong&gt;: The longer a chat continues, the more the AI seems to ignore custom instructions. Restarting the chat frequently and focusing on small, manageable tasks helps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test-Driven Development (TDD)&lt;/strong&gt;: TDD didn’t work as smoothly as expected. However, when this improves, coding with AI will likely reach a whole new level, enabling faster iteration with automated unit tests and quick fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cost Management
&lt;/h4&gt;

&lt;p&gt;AI tools incur costs for every request. To keep expenses under control:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Plan Ahead&lt;/strong&gt;: Draft clear, concise instructions before interacting with the AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize Code&lt;/strong&gt;: Use modular design to reduce the complexity of individual AI tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Locally&lt;/strong&gt;: Minimize back-and-forth iterations by testing generated code locally.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Moving Forward
&lt;/h3&gt;

&lt;p&gt;If you’re a Blender user on MacOS, this app might be interesting for you. Since it’s built with Flutter, I plan to port it to Windows and Linux soon. Expanding the app’s reach will involve addressing cross-platform nuances and optimizing performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools and Setup
&lt;/h3&gt;

&lt;p&gt;I utilized VS Code alongside Cline and Claude for this project. These tools provided a collaborative environment for AI-assisted coding, although their performance varied. Integrating a robust IDE setup and automation tools can significantly streamline AI development workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3mz0z4msezbp33sz0j3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3mz0z4msezbp33sz0j3j.png" alt="Image description" width="800" height="1709"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Despite its challenges, this experience has been incredibly rewarding. AI-driven development has its hiccups, but the speed and efficiency of creating an entire app are unparalleled. If you’re considering using AI for your projects, I’d say give it a shot—just remember to bring patience and a solid backup system!&lt;/p&gt;

&lt;p&gt;Let me know if you’re interested in trying the app or if you have any feedback. The future of coding is here, and it’s looking pretty exciting.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>appdev</category>
      <category>flutter</category>
    </item>
    <item>
      <title>How to create Scroll-Linked Animations with React and Framer Motion 💃🏻🕺🏻</title>
      <dc:creator>Marc Mintel</dc:creator>
      <pubDate>Wed, 01 Mar 2023 13:15:06 +0000</pubDate>
      <link>https://forem.com/mmintel/how-to-create-scroll-linked-animations-with-react-and-framer-motion-7cf</link>
      <guid>https://forem.com/mmintel/how-to-create-scroll-linked-animations-with-react-and-framer-motion-7cf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmintel.me%2Fcontent%2Fimages%2F2023%2F03%2FUntitled-design--1-.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmintel.me%2Fcontent%2Fimages%2F2023%2F03%2FUntitled-design--1-.png" alt="How to create Scroll-Linked Animations with React and Framer Motion 💃🏻🕺🏻" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scroll-linked animations are a popular technique that links animation to the user's scrolling on the page. As you scroll down the page, different elements will animate in or out, giving your website a unique and dynamic feel.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll be using React and Framer Motion to create a scroll-linked animation. Framer Motion is a powerful animation library that makes it easy to create fluid and beautiful animations with React. We'll also be using TypeScript, a popular language that adds strong typing to JavaScript and can help catch errors before runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;

&lt;p&gt;Here's the TypeScript code we'll be working with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { motion, useScroll, useTransform } from 'framer-motion'
import { useElementViewportPosition } from '../hooks/useElementViewportPosition'
import React, { useRef, PropsWithChildren } from 'react'

export const ScrollReveal: React.FC&amp;lt;PropsWithChildren&amp;lt;{
  offset?: number
  distance?: number
}&amp;gt;&amp;gt; = ({ offset = 0, distance = 50, children }) =&amp;gt; {
  const ref = useRef(null)
  const { position } = useElementViewportPosition(ref, offset)
  const { scrollYProgress } = useScroll()
  const opacity = useTransform(scrollYProgress, position, [0, 1])
  const y = useTransform(scrollYProgress, position, [distance, 0])

  return (
    &amp;lt;motion.div
      ref={ref}
      style={{
        opacity,
        y,
      }}
    &amp;gt;
      {children}
    &amp;lt;/motion.div&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here's the code for the &lt;code&gt;useElementViewportPosition&lt;/code&gt; hook that we'll be using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState, useEffect, RefObject } from 'react'

export function useElementViewportPosition(
  ref: RefObject&amp;lt;HTMLElement&amp;gt;,
  offset = 0,
) {
  const [position, setPosition] = useState([0, 0])

  useEffect(() =&amp;gt; {
    const update = () =&amp;gt; {
      if (!ref || !ref.current) return
      const pageHeight = document.body.scrollHeight
      const start = ref.current.offsetTop
      const end = start + ref.current.offsetHeight

      setPosition([(start + offset) / pageHeight, (end + offset) / pageHeight])
    }

    update()

    document.addEventListener('resize', update)

    return () =&amp;gt; {
      document.removeEventListener('resize', update)
    }
  }, [offset, ref])

  return { position }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;So, how do these two pieces of code work together to create those scroll-linked animations? Let me break it down for you.&lt;/p&gt;

&lt;p&gt;First, we're importing &lt;code&gt;motion&lt;/code&gt;, &lt;code&gt;useScroll&lt;/code&gt;, and &lt;code&gt;useTransform&lt;/code&gt; from Framer Motion, and &lt;code&gt;useElementViewportPosition&lt;/code&gt; from our own custom hook. We're also importing some stuff from React.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { motion, useScroll, useTransform } from 'framer-motion'
import { useElementViewportPosition } from '../hooks/useElementViewportPosition'
import React, { useRef, PropsWithChildren } from 'react'

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we're defining a new component called &lt;code&gt;ScrollReveal&lt;/code&gt;. This component takes two optional props: &lt;code&gt;offset&lt;/code&gt; and &lt;code&gt;distance&lt;/code&gt;, which we'll explain in a bit. It also takes some children that we'll animate as the user scrolls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const ScrollReveal: React.FC&amp;lt;PropsWithChildren&amp;lt;{
  offset?: number
  distance?: number
}&amp;gt;&amp;gt; = ({ offset = 0, distance = 50, children }) =&amp;gt; {
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside this component, we're creating a new ref with &lt;code&gt;useRef(null)&lt;/code&gt;. We're also calling our &lt;code&gt;useElementViewportPosition&lt;/code&gt; hook and passing in our &lt;code&gt;ref&lt;/code&gt; and &lt;code&gt;offset&lt;/code&gt;. This hook will return a value called &lt;code&gt;position&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking Down the Code
&lt;/h2&gt;

&lt;p&gt;Now that we've seen the code in action, let's break it down line by line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { motion, useScroll, useTransform } from 'framer-motion'
import { useElementViewportPosition } from '../hooks/useElementViewportPosition'
import React, { useRef, PropsWithChildren } from 'react'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we have our imports. We're using Framer Motion, a popular React animation library, and importing &lt;code&gt;motion&lt;/code&gt;, &lt;code&gt;useScroll&lt;/code&gt;, and &lt;code&gt;useTransform&lt;/code&gt;. We're also importing a custom hook called &lt;code&gt;useElementViewportPosition&lt;/code&gt; from our &lt;code&gt;../hooks&lt;/code&gt; folder. Finally, we're importing React and a couple of types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const ScrollReveal: React.FC&amp;lt;PropsWithChildren&amp;lt;{
  offset?: number
  distance?: number
}&amp;gt;&amp;gt; = ({ offset = 0, distance = 50, children }) =&amp;gt; {

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line exports a React functional component called &lt;code&gt;ScrollReveal&lt;/code&gt;. It's defined as a function that takes a prop object with optional &lt;code&gt;offset&lt;/code&gt; and &lt;code&gt;distance&lt;/code&gt; properties, as well as the &lt;code&gt;children&lt;/code&gt; prop. The component will use these props to determine how much to reveal and how far to animate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const ref = useRef(null)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line creates a React ref called &lt;code&gt;ref&lt;/code&gt; that we'll use later to track the position of the component in the viewport.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { position } = useElementViewportPosition(ref, offset)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line calls the &lt;code&gt;useElementViewportPosition&lt;/code&gt; hook we imported earlier, passing in our &lt;code&gt;ref&lt;/code&gt; and &lt;code&gt;offset&lt;/code&gt; props. The hook returns an object with a &lt;code&gt;position&lt;/code&gt; property that we'll use to animate the component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { scrollYProgress } = useScroll()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line calls another Framer Motion hook called &lt;code&gt;useScroll&lt;/code&gt;, which returns an object with a &lt;code&gt;scrollYProgress&lt;/code&gt; property that we'll use to animate the component.&lt;/p&gt;

&lt;h3&gt;
  
  
  useTransform does all the Magic!
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;useTransform&lt;/code&gt; hook is part of the Framer Motion library, which is used in the &lt;code&gt;ScrollReveal&lt;/code&gt; component.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;useTransform&lt;/code&gt; hook is used to create a relationship between the scroll position and an animated property of an element. In this case, it's used to adjust the opacity and y-position of the animated element (&lt;code&gt;motion.div&lt;/code&gt;) as the user scrolls.&lt;/p&gt;

&lt;p&gt;In more detail, &lt;code&gt;useTransform&lt;/code&gt; takes three arguments: &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;inputRange&lt;/code&gt;, and &lt;code&gt;outputRange&lt;/code&gt;. The &lt;code&gt;input&lt;/code&gt; argument is a value that changes over time, in this case the &lt;code&gt;scrollYProgress&lt;/code&gt; from &lt;code&gt;useScroll&lt;/code&gt;. The &lt;code&gt;inputRange&lt;/code&gt; argument is an array that defines the range of the input value (e.g. &lt;code&gt;[0, 1]&lt;/code&gt;), and the &lt;code&gt;outputRange&lt;/code&gt; argument is an array that defines the range of values for the output (e.g. &lt;code&gt;[distance, 0]&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const opacity = useTransform(scrollYProgress, position, [0, 1])
const y = useTransform(scrollYProgress, position, [distance, 0])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These lines use the &lt;code&gt;useTransform&lt;/code&gt; hook to create two new variables, &lt;code&gt;opacity&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;, that we'll use to animate the component. The &lt;code&gt;useTransform&lt;/code&gt; hook takes three arguments: a value to transform (in this case &lt;code&gt;scrollYProgress&lt;/code&gt;), the range of the input values (&lt;code&gt;position&lt;/code&gt;), and the range of the output values (&lt;code&gt;[0, 1]&lt;/code&gt; for &lt;code&gt;opacity&lt;/code&gt; and &lt;code&gt;[distance, 0]&lt;/code&gt; for &lt;code&gt;y&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return (
    &amp;lt;motion.div
      ref={ref}
      style={{
        opacity,
        y,
      }}
    &amp;gt;
      {children}
    &amp;lt;/motion.div&amp;gt;
  )

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, we return a &lt;code&gt;motion.div&lt;/code&gt; with our &lt;code&gt;ref&lt;/code&gt; and two style properties, &lt;code&gt;opacity&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;, that we created using the &lt;code&gt;useTransform&lt;/code&gt; hook. We also render the &lt;code&gt;children&lt;/code&gt; prop inside the &lt;code&gt;motion.div&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article, we've explored how to use TypeScript, React, and Framer Motion to create a scroll-linked animation. We've broken down the code line by line and explained what each part does. If you want to learn more about TypeScript, check out the &lt;a href="https://www.typescriptlang.org/docs/handbook/intro.html?ref=mintel-me" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;. If you want to learn more about Framer Motion, check out the &lt;a href="https://www.framer.com/motion/?ref=mintel-me" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;. Happy animating!&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>framermotion</category>
    </item>
    <item>
      <title>Unity DevLog #2: Basic environment</title>
      <dc:creator>Marc Mintel</dc:creator>
      <pubDate>Fri, 08 Jan 2021 10:46:33 +0000</pubDate>
      <link>https://forem.com/mmintel/unity-devlog-2-basic-environment-16gp</link>
      <guid>https://forem.com/mmintel/unity-devlog-2-basic-environment-16gp</guid>
      <description>&lt;p&gt;Hey there, so after &lt;a href="https://dev.to/mmintel/unity-devlog-1-introducing-the-project-n3d"&gt;I introduced my idea&lt;/a&gt; let's create a basic environment to get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do your research
&lt;/h2&gt;

&lt;p&gt;So what we need first is obviously a matchfield. A typical foosball matchfield is 120cm long and 68cm wide. That's the scale for my field so I know that one unit equals 1cm.&lt;/p&gt;

&lt;p&gt;However don't do too much research: at the end I want to create a fun game and not just make a digital version of a real life foosball game. Real life is completely different so don't waste too much time on recreating every single piece. It's probably not important that the walls are exactly the same height as they should be according to some Foosball League regulations, it's more important that the overall gameplay is great and balanced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create the field
&lt;/h2&gt;

&lt;p&gt;I used a simple Plane object and just added a green material on it. I then used cubes with the basic material to create the walls.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2ekcelwpb81jxrw9um8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2ekcelwpb81jxrw9um8j.png" alt="Screenshot 2021-01-06 155816" width="800" height="574"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi7gaxpways1tld8tou5z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi7gaxpways1tld8tou5z.png" alt="Screenshot 2021-01-06 155850" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Refining it
&lt;/h2&gt;

&lt;p&gt;So one of the first problems that come to my mind when I remember my last foosball match: the ball sometimes will just stand still, especially in the corners. So I went ahead and raised these corners just a tiny little bit so the ball will roll back to a player. &lt;/p&gt;

&lt;p&gt;I quickly noticed this wasn't possible using a plane, so I removed it and added a cube. Then I noticed that you can't just grab a vertex and move it up. So I created a cube in blender and exported it as .fbx file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnukvnw7qnezfw69w2zwq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnukvnw7qnezfw69w2zwq.png" alt="Screenshot 2021-01-08 113309" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later I found out: you can use blender files directly with unity (that's awesome) and you can use &lt;a href="https://unity3d.com/de/unity/features/worldbuilding/probuilder" rel="noopener noreferrer"&gt;ProBuilder&lt;/a&gt; to modify meshes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving on
&lt;/h2&gt;

&lt;p&gt;Yes that's a very basic environment but I don't want to waste too much time on this and focus on creating an MVP. The field is not that important for it, I can polish it later, add textures, lighting and most importantly: a goal.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Unity DevLog #1: Introducing the project</title>
      <dc:creator>Marc Mintel</dc:creator>
      <pubDate>Wed, 06 Jan 2021 09:54:06 +0000</pubDate>
      <link>https://forem.com/mmintel/unity-devlog-1-introducing-the-project-n3d</link>
      <guid>https://forem.com/mmintel/unity-devlog-1-introducing-the-project-n3d</guid>
      <description>&lt;p&gt;Hi all! I'm Marc and I'm currently learning Unity. The way I learn best is to first consume a whole lot of videos on a topic and then start a real project.&lt;/p&gt;

&lt;h2&gt;
  
  
  So why a public devlog?
&lt;/h2&gt;

&lt;p&gt;To recap my learnings I will post most of the stuff here on dev.to. On the one hand those are general Unity learnings (you will find these in my "Digging into Unity" series) and on the other hand it's some kind of diary about the progress of my own project (this devlog).&lt;/p&gt;

&lt;p&gt;This is by no means a perfect solution or way but I find devlogs of others even more interesting than a presentation of a finished project. With finished projects you are missing the most important parts: the thought process. How do you get from one thing to another?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Notice: my devlog will be a beginners devlog, I will run into the wrong direction here and there until I figure out a better way (or never if I don't and nobody tells me).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing the project
&lt;/h2&gt;

&lt;p&gt;So let's talk about the project. When I create something for learning it needs to be something that's real. If I just follow practical tutorials I won't turn on my brain.&lt;/p&gt;

&lt;p&gt;So I need an idea that has potential to grow and where I can dive into deeper topics. Furthermore it's scope should not be too big, e.g. at this stage I don't want to deal with things like scaling and performance optimization or heavy visual effects and such.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;I will create an online Foosball game. So I have been working for a few years in an internet agency that had a foosball table in the office and it was so fun to me. Unfortunately other agencies didn't allow them because they were too loud, also nowadays during Corona times you cannot enjoy playing such a game with others. So I want to recreate the emotional gameplay that you have when playing a real foosball game in a digital way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F764th0v7o2b1041zmggi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F764th0v7o2b1041zmggi.jpg" alt="stefan-steinbauer-va-B5dBbpr4-unsplash" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What makes a foosball game great? The core mechanic of my game will definitely be great physics and controls. Foosball is a really fast skill based game. It should be easy to catch up but hard to master. Also it's a competitive game so multiplayer mode is essential. On the other hand you will also need a way to play solo to train your skills so there is also a need in creating an Enemy AI.&lt;/p&gt;

&lt;p&gt;The basic game play should be straight forward: create the basic environment, add the figures, attach controls and physics and create a scoring system. That's it.&lt;/p&gt;

&lt;p&gt;How can I grow this game? So you might say a foosball game is boring, but I doubt it. To extend the basic gameplay I could add an Enemy AI, maybe even using machine learning. I can add multiplayer gameplay, a ranking system and so much more. The controls are not that difficult so I could even imagine publishing this game cross platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concept and planning
&lt;/h2&gt;

&lt;p&gt;I know good projects need planning and a great concept, prototypes and market research. I don't care. I don't know if there are any great games like this already, I won't do any research as this will probably just lead to a point where I loose motivation. I focus on my game and I will add features and ideas step by step, it just needs to make fun and as long as I learn from it this project was a success.&lt;/p&gt;

&lt;p&gt;That being said, I will see you on the &lt;a href="https://dev.to/mmintel/unity-devlog-2-basic-environment-16gp"&gt;next episode&lt;/a&gt; where I will setup the basic environment.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Digging into Unity: Scriptable Objects</title>
      <dc:creator>Marc Mintel</dc:creator>
      <pubDate>Wed, 06 Jan 2021 06:34:34 +0000</pubDate>
      <link>https://forem.com/mmintel/digging-into-unity-scriptable-objects-288i</link>
      <guid>https://forem.com/mmintel/digging-into-unity-scriptable-objects-288i</guid>
      <description>&lt;p&gt;&lt;em&gt;Hey there, I'm Marc and I'm a professional web developer since a few years. It's time for something else so I decided to learn game development with C# and Unity. I'm going to use dev.to to keep my personal notes and summaries.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As I understand it so far a ScriptableObject is one of those things in Unity that you pick up pretty quickly but which is highly underestimated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a ScriptableObject?
&lt;/h2&gt;

&lt;p&gt;I find this name quite confusing, I've never heard of something like this in web development. I would say these are just objects that you can edit in Unity. But "just objects" is also a bit misleading, because they are not much different to MonoBehaviours. In fact they just don't have a transform and a GameObject, so they are not being updated each frame and therefor don't have a &lt;code&gt;Start()&lt;/code&gt; or &lt;code&gt;Update()&lt;/code&gt; method. You can add properties and methods to it but it won't execute any kind of update method on each frame.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: when you change the data of a ScriptableObject they are not reverted when you end the game. This has pros and cons of course.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create a ScriptableObject?
&lt;/h2&gt;

&lt;p&gt;Create a new script and extend &lt;code&gt;ScriptableObject&lt;/code&gt; instead of &lt;code&gt;MonoBehaviour&lt;/code&gt; and remove the lifecycle methods &lt;code&gt;Start&lt;/code&gt; and &lt;code&gt;Update&lt;/code&gt;. The rest is up to you, e.g. you can add some public properties and methods.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ScriptableObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a ScriptableObject from GUI
&lt;/h3&gt;

&lt;p&gt;You can annotate your ScriptableObject class with a &lt;code&gt;CreateAssetMenu&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;CreateAssetMenu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;menuName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Bar/Foo"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ScriptableObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a new entry in the context menu of Unity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj5qel6vmpz6pzxsnjs74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj5qel6vmpz6pzxsnjs74.png" alt="Context menu of ScriptableObjects" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: when you create a new ScriptableObject the context menu it's saved as an &lt;code&gt;.asset&lt;/code&gt; file.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a ScriptableObject from code
&lt;/h3&gt;

&lt;p&gt;You can also create a ScriptableObject using its static method and store it in memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="n"&gt;mySO&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ScriptableObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateInstance&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What can you do with a ScriptableObject?
&lt;/h2&gt;

&lt;p&gt;Generally a ScriptableObject is known to keep data often used for configs.&lt;br&gt;
But actually you can do so much with it that I am sure just scratched the surface. You can do whole architecture systems based on ScriptableObjects as they are so powerful. You can use them for Events or to "replace" Enums. Especially because designers can work with them without touching a line of code, but I will cover this in another article (once I figured out).&lt;/p&gt;
&lt;h3&gt;
  
  
  Using a ScriptableObject in a MonoBehaviour
&lt;/h3&gt;

&lt;p&gt;You can simply reference a ScriptableObject from a MonoBehaviour by using it's type definition, e.g to use the ScriptableObject named &lt;code&gt;Foo&lt;/code&gt; and store it in a variable named &lt;code&gt;mySO&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NewBehaviourScript&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="n"&gt;mySO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;That's it about ScriptableObjects. As I am still completely new on Unity take this with a grain of salt. The provided information are based on my own experiences and research. If you have something to add or correct please comment it.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Digging into Unity: Prefabs</title>
      <dc:creator>Marc Mintel</dc:creator>
      <pubDate>Tue, 05 Jan 2021 15:40:08 +0000</pubDate>
      <link>https://forem.com/mmintel/digging-into-unity-prefabs-i4a</link>
      <guid>https://forem.com/mmintel/digging-into-unity-prefabs-i4a</guid>
      <description>&lt;p&gt;&lt;em&gt;Hey there, I'm Marc and I'm a professional web developer since a few years. It's time for something else so I decided to learn game development with C# and Unity. I'm going to use dev.to to keep my personal notes and summaries.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So one of the first things that I encountered in Unity are so called &lt;em&gt;Prefabs&lt;/em&gt;. What's that? What does it even mean?&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Prefab?
&lt;/h2&gt;

&lt;p&gt;The word is short for &lt;em&gt;prefabricated&lt;/em&gt;. A Prefab is a reusable asset that contains a GameObject, it's configuration, it's components and everything that's nested below it. You can see Prefabs as templates for GameObjects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvyg8zi77iawyuife8tqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvyg8zi77iawyuife8tqs.png" alt="Prefab in a Scene" width="534" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Prefab is indicated by this little blue box icon. The arrow icon on the right will bring you to the Prefab editor, where you can edit the Prefab in isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create a Prefab?
&lt;/h2&gt;

&lt;p&gt;Just drag a GameObject from your Scene window into your Project window.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use Prefabs
&lt;/h2&gt;

&lt;p&gt;The general rule of thumb is that you should almost always prefab your GameObjects, as you are most likely going to reuse them at any time in future. You can even prefab your camera and lighting, which is useful when you create multiple scenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can you do with a Prefab?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overriding
&lt;/h3&gt;

&lt;p&gt;If you could just use a Prefab as it is it would not be that useful. That's why you can override it's configuration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1rrdy57gnzinmwijef9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1rrdy57gnzinmwijef9n.png" alt="Prefab Overrides" width="400" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overrides are marked as bold. If a Prefab is overridden it will always keep these overrides, even if you change that property in your Prefab. So if you override a property you are removing the sync. You can then apply your overrides to the Prefab to apply your changes to all instances or reset all overrides to revert your changes of the current instance to the Prefab configuration. Changes made in the Prefab editor are applied immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nesting
&lt;/h3&gt;

&lt;p&gt;You can also nest Prefabs within Prefabs to combine them in various ways. Nothing else to say I guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unpacking
&lt;/h3&gt;

&lt;p&gt;Unpacking is the process of unlinking a GameObject from a Prefab. That doesn't delete the Prefab nor the GameObject, it just removes the syncing between those.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;That's it about Prefabs. As I am still completely new on Unity take this with a grain of salt. The provided information are based on my own experiences and research. If you have something to add or correct please comment it.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
