Initial commit
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d3657d2713d19ec47b216581399986b1
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
public class opencloseDoor : MonoBehaviour
|
||||
{
|
||||
|
||||
public Animator openandclose;
|
||||
public bool open;
|
||||
public Transform Player;
|
||||
|
||||
void Start()
|
||||
{
|
||||
open = false;
|
||||
}
|
||||
|
||||
void OnMouseOver()
|
||||
{
|
||||
{
|
||||
if (Player)
|
||||
{
|
||||
float dist = Vector3.Distance(Player.position, transform.position);
|
||||
if (dist < 15)
|
||||
{
|
||||
if (open == false)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(opening());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (open == true)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(closing());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IEnumerator opening()
|
||||
{
|
||||
print("you are opening the door");
|
||||
openandclose.Play("Opening");
|
||||
open = true;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
IEnumerator closing()
|
||||
{
|
||||
print("you are closing the door");
|
||||
openandclose.Play("Closing");
|
||||
open = false;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1e8192f35a44301488ec0f072d9a16fe
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
public class opencloseDoor1 : MonoBehaviour
|
||||
{
|
||||
|
||||
public Animator openandclose1;
|
||||
public bool open;
|
||||
public Transform Player;
|
||||
|
||||
void Start()
|
||||
{
|
||||
open = false;
|
||||
}
|
||||
|
||||
void OnMouseOver()
|
||||
{
|
||||
{
|
||||
if (Player)
|
||||
{
|
||||
float dist = Vector3.Distance(Player.position, transform.position);
|
||||
if (dist < 15)
|
||||
{
|
||||
if (open == false)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(opening());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (open == true)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(closing());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IEnumerator opening()
|
||||
{
|
||||
print("you are opening the door");
|
||||
openandclose1.Play("Opening 1");
|
||||
open = true;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
IEnumerator closing()
|
||||
{
|
||||
print("you are closing the door");
|
||||
openandclose1.Play("Closing 1");
|
||||
open = false;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4b5e0617227fa4743be84f23d9e5cb42
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
public class opencloseStallDoor : MonoBehaviour
|
||||
{
|
||||
|
||||
public Animator openandclose;
|
||||
public bool open;
|
||||
public Transform Player;
|
||||
|
||||
void Start()
|
||||
{
|
||||
open = false;
|
||||
}
|
||||
|
||||
void OnMouseOver()
|
||||
{
|
||||
{
|
||||
if (Player)
|
||||
{
|
||||
float dist = Vector3.Distance(Player.position, transform.position);
|
||||
if (dist < 15)
|
||||
{
|
||||
if (open == false)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(opening());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (open == true)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(closing());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IEnumerator opening()
|
||||
{
|
||||
print("you are opening the door");
|
||||
openandclose.Play("OpeningStall");
|
||||
open = true;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
IEnumerator closing()
|
||||
{
|
||||
print("you are closing the door");
|
||||
openandclose.Play("ClosingStall");
|
||||
open = false;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b697b9be3c8d9534ebd171d2b41d6f4f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 34e5b87835da8eb4bb4098bd966305cb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c95c1404923c9134f9634c0671b773ae
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
|
||||
public class Drawer_Pull_X : MonoBehaviour
|
||||
{
|
||||
|
||||
public Animator pull_01;
|
||||
public bool open;
|
||||
public Transform Player;
|
||||
|
||||
void Start()
|
||||
{
|
||||
open = false;
|
||||
}
|
||||
|
||||
void OnMouseOver()
|
||||
{
|
||||
{
|
||||
if (Player)
|
||||
{
|
||||
float dist = Vector3.Distance(Player.position, transform.position);
|
||||
if (dist < 10)
|
||||
{
|
||||
print("object name");
|
||||
if (open == false)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(opening());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (open == true)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(closing());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IEnumerator opening()
|
||||
{
|
||||
print("you are opening the door");
|
||||
pull_01.Play("openpull_01");
|
||||
open = true;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
IEnumerator closing()
|
||||
{
|
||||
print("you are closing the door");
|
||||
pull_01.Play("closepush_01");
|
||||
open = false;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e0d5557a01f4e0740bd53d6ed2ab7327
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbe129b7b03ebee479e57de9c57e9527
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
public class Drawer_Pull_Z : MonoBehaviour
|
||||
{
|
||||
|
||||
public Animator pull;
|
||||
public bool open;
|
||||
public Transform Player;
|
||||
|
||||
void Start()
|
||||
{
|
||||
open = false;
|
||||
}
|
||||
|
||||
void OnMouseOver()
|
||||
{
|
||||
{
|
||||
if (Player)
|
||||
{
|
||||
float dist = Vector3.Distance(Player.position, transform.position);
|
||||
if (dist < 10)
|
||||
{
|
||||
print("object name");
|
||||
if (open == false)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(opening());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (open == true)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(closing());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IEnumerator opening()
|
||||
{
|
||||
print("you are opening the door");
|
||||
pull.Play("openpull");
|
||||
open = true;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
IEnumerator closing()
|
||||
{
|
||||
print("you are closing the door");
|
||||
pull.Play("closepush");
|
||||
open = false;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 286620fa050ddc24d90bd777daaa73c5
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ddfa03a32d1805e4c9518337a71dc830
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
public class MouseLook : MonoBehaviour
|
||||
{
|
||||
|
||||
public float mouseXSensitivity = 100f;
|
||||
|
||||
public Transform playerBody;
|
||||
|
||||
float xRotation = 0f;
|
||||
|
||||
// Start is called before the first frame update
|
||||
void Start()
|
||||
{
|
||||
Cursor.lockState = CursorLockMode.Locked;
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
float mouseX = Input.GetAxis("Mouse X") * mouseXSensitivity * Time.deltaTime;
|
||||
float mouseY = Input.GetAxis("Mouse Y") * mouseXSensitivity * Time.deltaTime;
|
||||
|
||||
xRotation -= mouseY;
|
||||
xRotation = Mathf.Clamp(xRotation, -90f, 90f);
|
||||
|
||||
transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
|
||||
playerBody.Rotate(Vector3.up * mouseX);
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 478f19f2b564b5a459ccd72d2ea6afe1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
public class PlayerMovement : MonoBehaviour
|
||||
{
|
||||
|
||||
public CharacterController controller;
|
||||
|
||||
public float speed = 5f;
|
||||
public float gravity = -15f;
|
||||
|
||||
Vector3 velocity;
|
||||
|
||||
bool isGrounded;
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
float x = Input.GetAxis("Horizontal");
|
||||
float z = Input.GetAxis("Vertical");
|
||||
|
||||
Vector3 move = transform.right * x + transform.forward * z;
|
||||
|
||||
controller.Move(move * speed * Time.deltaTime);
|
||||
|
||||
velocity.y += gravity * Time.deltaTime;
|
||||
|
||||
controller.Move(velocity * Time.deltaTime);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c84cdf898723e1a4b9e4954eb5a76a33
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
|
||||
public class SceneSwitchGen : MonoBehaviour
|
||||
{
|
||||
|
||||
// Use this for initialization
|
||||
void Start()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Alpha1))
|
||||
{
|
||||
SceneManager.LoadScene("Structure_01");
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Alpha2))
|
||||
{
|
||||
SceneManager.LoadScene("Structure_02");
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.Alpha3))
|
||||
{
|
||||
SceneManager.LoadScene("Structure_03");
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Alpha4))
|
||||
{
|
||||
SceneManager.LoadScene("Structure_04");
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Alpha5))
|
||||
{
|
||||
SceneManager.LoadScene("Structure_05");
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Alpha6))
|
||||
{
|
||||
SceneManager.LoadScene("Structure_06");
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Alpha7))
|
||||
{
|
||||
SceneManager.LoadScene("Props Furniture Showcase");
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Escape))
|
||||
{
|
||||
Application.Quit();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4189f6b82d537b45b085891d0ec97f4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dcd0c600df8e6b244851ae6aa001217e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
public class opencloseWindow : MonoBehaviour
|
||||
{
|
||||
|
||||
public Animator openandclosewindow;
|
||||
public bool open;
|
||||
public Transform Player;
|
||||
|
||||
void Start()
|
||||
{
|
||||
open = false;
|
||||
}
|
||||
|
||||
void OnMouseOver()
|
||||
{
|
||||
{
|
||||
if (Player)
|
||||
{
|
||||
float dist = Vector3.Distance(Player.position, transform.position);
|
||||
if (dist < 15)
|
||||
{
|
||||
if (open == false)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(opening());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (open == true)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(closing());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IEnumerator opening()
|
||||
{
|
||||
print("you are opening the Window");
|
||||
openandclosewindow.Play("Openingwindow");
|
||||
open = true;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
IEnumerator closing()
|
||||
{
|
||||
print("you are closing the Window");
|
||||
openandclosewindow.Play("Closingwindow");
|
||||
open = false;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 817d7f89b6e10ed4d804fa09670bf2ea
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SojaExiles
|
||||
|
||||
{
|
||||
public class opencloseWindow1 : MonoBehaviour
|
||||
{
|
||||
|
||||
public Animator openandclosewindow1;
|
||||
public bool open;
|
||||
public Transform Player;
|
||||
|
||||
void Start()
|
||||
{
|
||||
open = false;
|
||||
}
|
||||
|
||||
void OnMouseOver()
|
||||
{
|
||||
{
|
||||
if (Player)
|
||||
{
|
||||
float dist = Vector3.Distance(Player.position, transform.position);
|
||||
if (dist < 15)
|
||||
{
|
||||
if (open == false)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(opening());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (open == true)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
StartCoroutine(closing());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IEnumerator opening()
|
||||
{
|
||||
print("you are opening the Window");
|
||||
openandclosewindow1.Play("Openingwindow 1");
|
||||
open = true;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
IEnumerator closing()
|
||||
{
|
||||
print("you are closing the Window");
|
||||
openandclosewindow1.Play("Closingwindow 1");
|
||||
open = false;
|
||||
yield return new WaitForSeconds(.5f);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 79023f3c1c542ca478d98525efcaa0bd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user