ARoundNUS is an innovative augmented reality (AR) application designed to enhance the navigation and exploration experience at the National University of Singapore (NUS). The app aims to help students, staff, and visitors discover and interact with various locations and points of interest across the campus in an engaging and intuitive way.
- AR Navigation: Real-time directional guidance using augmented reality
- Points of Interest: Discover and learn about key locations on campus
- Interactive Map: 2D map view with searchable locations
- Information Hub: Detailed information about buildings, facilities, and services
- User Authentication: Sign in with email/password, Google, or Apple accounts
- Social Interactivity and Sharability: Ability to share routes and location info with other app users
- React Native: Cross-platform mobile development framework
- Justification: Enables development for both iOS and Android with a single codebase
- Expo: Development framework and platform for React Native
- Justification: Simplifies development process and provides essential tools and services
- Firebase Authentication: User authentication service
- Justification: Secure and easy-to-implement authentication with multiple sign-in methods
- Google Sign-In: OAuth-based authentication for Google accounts
- Justification: Provides a familiar and secure sign-in option for users
- Unity:
- Justification: Industry standard with a wide range of libraries that integrate seamlessly with Android's ARCore and iOS' ARKit SDKs and the ability to embed Unity projects within React Native applications
- MultiSet SDK
- Justification: Granular control over mapping process while still being able to simply use any LiDAR-enabled smartphone, good localization speeds and accuracies, and the ability to stitch maps together thereby simplifying scalability of future extensions greatly
- Firebase: Backend-as-a-Service platform
- Justification: Provides authentication, database, and storage services in one platform
- Firestore: NoSQL cloud database
- Justification: Flexible, scalable database for storing application data
aroundnus/
│
├── assets/ # Images for README.md
│
├── frontend/ # React Native (Expo) mobile app
│ │
│ ├── app/ # App entry and routing (Expo Router)
│ │ ├── (tabs)/ # Tab navigation screens
│ │ ├── (modals)/ # Modal screens
│ │ ├── _layout.tsx # Main layout
│ │ └── signin.tsx # Sign-in screen
│ ├── components/ # Reusable UI components
│ │ ├── ui/ # UI primitives (buttons, icons, etc.)
│ │ └── navigation/ # Navigation-related components
│ ├── constants/ # App-wide constants (colors, etc.)
│ ├── hooks/ # Custom React hooks
│ ├── scripts/ # Utility scripts (e.g., reset-project.js)
│ ├── assets/ # App-specific assets (images, fonts)
│ └── ... # Other files
│
├── backend/ # Node.js/Express backend API
│ │
│ ├── config/ # Configuration files (e.g., firebase.js)
│ ├── controllers/ # Route controllers (business logic)
│ ├── middleware/ # Express middleware (e.g., auth)
│ ├── routes/ # Express route definitions
│ ├── tests/ # Automated tests (Jest)
│ ├── coverage/ # Test coverage reports
│ ├── index.js # API entry point
│ └── ... # Other files
│
├── unity/ # Unity project
│
└── ... # Other files
The .apk file for this project can be downloaded here. Download it onto your Android phone and open it.
To install the app, you need to manually export the app from the source code. Follow the iOS-relevant instructions in the next section.
The following procedure is to directly, from the source code, export the app as an .apk file and/or onto an iPhone.
- Node.js
- JDK 17
- npm
- Expo
- Unity Hub and Unity Engine 6000.1.x
- Xcode
- Google Cloud Console Account
- Android Studio
- An Android phone with Android 15+
- An iPhone
-
Change the working directory to
frontend/. -
Install dependencies by running:
npm i
-
Run:
npx expo prebuild
This will automatically create the
frontend/android/andfrontend/ios/folders. -
Replace
frontend/node_modules/@azesmway/react-native-unity/android/src/main/java/com/azesmwayreactnativeunity/UPlayer.javawith theUIPlayer.javafile in the root directory of the repository. -
Go to
frontend/node_modules/@azesmway/react-native-unityand copy the contents of theunity/folder into theunity/folder at the root of the repository. -
Using Unity Hub, select Add new project and open the
unity/folder (in the root of the repository). In Unity, if not opened already, open the Navigation scene under Scenes folder.
Refer to the relevant per-OS sections below for your intended phone's OS.
(Taken from the documentation for @azesmway/react-native-unity)
-
In Unity, go to File > Build Profiles > iOS > Build and build the project in any folder except inside the current repository.
-
Open the built project in Xcode.
-
Select the Data folder and check the box under "Target Membership" to include it in
UnityFramework.
-
In the Xcode project, navigate to
Unity-iPhone/Libraries/Plugins/iOSand selectNativeCallProxy.h. ChangeUnityFramework's target membership from Project to Public.
-
Locate the built framework in Finder (right-click > Show in Finder) and move it to
frontend/unity/builds/ios/.
-
In
frontend/, clear Pods cache and reinstall:rm -rf ios/Pods && rm -f ios/Podfile.lock && npx pod-install
-
In
frontend/, run:npm run ios
-
An
.xcodeprojfile will be generated infrontend/ios/upon build completion. Open it in Xcode. -
Connect an iPhone to your Mac.
-
If necessary, manage the signing capabilities of the Xcode project. Then, press the play button to build it onto your iPhone. The app will install itself and will be ready for use after the build is complete.
(Taken from the documentation for @azesmway/react-native-unity)
-
In Unity Hub, go to File > Build Profiles > Android and tick the Export option. Export the project to
frontend/unity/builds/android. -
Remove the
<intent-filter>...</intent-filter>block from:frontend/unity/builds/android/unityLibrary/src/main/AndroidManifest.xml -
Add to
android/settings.gradle:include ':unityLibrary' project(':unityLibrary').projectDir = new File('..\\unity\\builds\\android\\unityLibrary') include ':unityLibrary:xrmanifest.androidlib'
-
Edit
android/build.gradleto add insideallprojects:allprojects { repositories { flatDir { dirs "${project(':unityLibrary').projectDir}/libs" } // ... } } -
Add to
android/gradle.properties:unityStreamingAssets=.unity3d -
Add the following string to
android/app/src/main/res/values/strings.xml:<string name="game_view_content_description">Game view</string>
-
Add your Google Maps API key to
frontend/android/app/src/main/AndroidManifest.xml:<meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_API_KEY_HERE"/>
If you don't have an API key, go to Google Cloud Console, create a project, and enable the Google Maps SDK for Android API.
-
Create a new file named
local.propertiesinfrontend/android/and pastesdk.dir=<YOUR_ANDROID_SDK_PATH_HERE>into it. (You can find your Android SDK path by going to Android Studio > settings icon > copy the text in Android SDK Location).
-
Connect an Android phone to your computer with USB debugging enabled.
(To enable: go to About phone > Software information, tap Build number 7 times, enter password if needed, then go to Developer settings > USB debugging.) -
In
frontend/, run:npm run android
The app will launch automatically on your phone. For development, any changes to the source code will generally be reflected immediately upon pressing
rin the terminal to reload the app. Otherwise, rerunnpm run android.
-
In
frontend/android, run:./gradlew assembleRelease
-
The
.apkfile will be generated at:frontend/android/app/build/outputs/apk/release/app-release.apk
-
Generally, it is good to clean the previous failed build by running
./gradlew clean
in
frontend/android. -
When using Windows, enable long paths in the Registry Editor.
-
If the terminal returns an error stating
This computer is not authorized for developing on Device XXXXXXX, go to your Android phone’s settings > Developer options > Revoke USB debugging authorizations. Then, reconnect your Android phone (and re-enable USB debugging if it was turned off automatically).
Developed by Clement Aditya Chendra and Dylan Ananda Astono.



