2
2013
Inventory Script Test
Testing one idea for a inventory system. (free sword from assetstore)
Basic idea is,
– Use the same objects inside the inventory (3D model, with colliders)
– No need to draw icons or to use unity GUI()
– Objects take realistic amount of space, you could even try to fit lots of objects by placing them between others (or maybe later on top of each other, just check for stack maxheight..)
– Maybe later could try even more realistic 3D inventory: 3D bag, objects are rigidbodies that you push/pull inside the bag (and they fall and mix there with physics.. glass objects would break if collision magnitude is > x..)
Webplayer:
http://unitycoder.com/upload/demos/InventoryRealObjects1/
(sound from: http://www.bfxr.net )
—
Info:
– swords: tag = pickable, layer = pickables)
– ground: tag = ground
– inventory plane: tag = inventory
Source C# (Inventory.cs) :
using UnityEngine;
using System.Collections;
// TODO:
// - add borders to inventory "box"
// - drag from clicked pos, not from pivot (take offset onClick)
public class Inventory : MonoBehaviour {
//private LayerMask mask = -1;
public Transform inventoryPlane;
public dragHelper dragHelperScript;
private bool grabbed = false;
private Transform grabbedObj;
private int layermask = 9; //<< 9;
private int layermaskInverted = 1<< 9;
private Vector3 grabOffset;
private Vector3 origPos;
private Ray ray;
private RaycastHit hit;
private bool inventoryVisible=true;
void Start ()
{
}
void Update ()
{
// inventory on off
if (Input.GetKeyDown("i"))
{
inventoryVisible = !inventoryVisible;
if (inventoryVisible)
{
inventoryPlane.position -= new Vector3(100,0,0);
}else{
inventoryPlane.position += new Vector3(100,0,0);
}
}
// user clicks
if (Input.GetMouseButtonDown(0))
{
// check for anything pickable
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 50))
{
//float distanceToGround = hit.distance;
if (hit.transform.tag == "pickable")
{
// grab it
//Debug.Log(hit.transform.name);
grabbed = true;
grabbedObj = hit.transform;
//grabbedObj.collider.isTrigger = true;
origPos = grabbedObj.position;
grabOffset = grabbedObj.position-hit.point;
PlaySound(2);
// TODO: if it is inside inventory, then remove helper and rb first..
// create boundingbox? to check for collisions
// add dragChecker script to the object (has onColliderStay())
// add rigidbody, if not exists
if (!grabbedObj.rigidbody)
{
grabbedObj.gameObject.AddComponent("Rigidbody");
}
grabbedObj.rigidbody.useGravity = false;
grabbedObj.rigidbody.constraints = RigidbodyConstraints.FreezeAll;
// add helperscript
//dragHelperScript = grabbedObj.gameObject.AddComponent<dragHelperScript>();
grabbedObj.gameObject.AddComponent("dragHelper");
// reset collision
grabbedObj.gameObject.GetComponent<dragHelper>().isColliding = false;
grabbedObj.gameObject.renderer.material.color = Color.white;
}
}
}
// we are dragging something
if (grabbed)
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//if (Physics.Raycast(ray, out hit, 100, layermask))
if (Physics.Raycast(ray, out hit, 100, layermask))
{
//grabbedObj.position = hit.point+grabbedObj.collider.bounds.size;
grabbedObj.position = hit.point+grabOffset+Vector3.up*grabbedObj.collider.bounds.size.y;
}else{
Debug.Log("some error..");
// drag it near camera..given distance
//Vector3 p = Camera.main.ScreenToWorldPoint(Input.mousePosition)+new Vector3(0,0,10);
//grabbedObj.position = p;
}
}
// dropit
if (Input.GetMouseButtonUp(0))
{
if (!grabbed) return;
// todo: cannot drop if its colliding with 1 or more objects
if (!grabbedObj.gameObject.GetComponent<dragHelper>().isColliding)
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100, layermask)) // we hit inventory?
{
//Debug.Log(hit.transform.name);
// dropped to inventory
if (hit.transform.tag == "inventory" && grabbed)
{
// add rigidbody, if not exists
if (grabbedObj.rigidbody)
{
Destroy (grabbedObj.rigidbody);
// grabbedObj.gameObject.AddComponent("Rigidbody");
}
// grabbedObj.rigidbody.useGravity = true;
// grabbedObj.rigidbody.constraints = RigidbodyConstraints.FreezeAll;
//grabbedObj.rigidbody.isKinematic = true;
grabbedObj.parent = inventoryPlane;
// reset collision (reset from other also?)
// grabbedObj.gameObject.GetComponent<dragHelper>().isColliding = false;
// grabbedObj.gameObject.renderer.material.color = Color.white;
//Destroy (grabbedObj.gameObject.GetComponent<dragHelper>());
//grabbedObj.collider.isTrigger = false;
grabbed = false;
grabbedObj = null;
PlaySound(1);
}
// drop to ground
if (hit.transform.tag == "ground" && grabbed)
{
Debug.Log("1");
origPos = hit.point+Vector3.up*grabbedObj.collider.bounds.size.y;
dropBack();
}
}else{ // not hitting good object
// cannot drop here
dropBack();
}
}else{
// Debug.Log(2);
dropBack();
}
}
}
void dropBack()
{
// remove from inventory (if it was there)
grabbedObj.parent = null;
// restoro position, drag failed..
grabbedObj.position = origPos;
grabbedObj.gameObject.GetComponent<dragHelper>().isColliding = false;
grabbedObj.gameObject.renderer.material.color = Color.white;
// remove rb
Destroy (grabbedObj.rigidbody);
grabbed = false;
grabbedObj = null;
PlaySound(1);
// restore colors?
// remove helper script
}
void PlaySound(int type)
{
// TODO: different types..ring, bottle, metal..
audio.pitch = type;
audio.Play();
}
}
dragHelper.cs
using UnityEngine;
using System.Collections;
public class dragHelper : MonoBehaviour {
public bool isColliding=false;
public Transform other;
void OnCollisionEnter(Collision collisionInfo)
{
// fx
// set color
if (collisionInfo.transform.tag != "inventory" && collisionInfo.transform.tag != "ground")
{
isColliding = true;
other = collisionInfo.transform;
renderer.material.color = Color.red;
}
}
void OnCollisionStay(Collision collisionInfo)
{
//if (collisionInfo.transform.tag != "inventory")
//Debug.Log("we are hittingh..");
// other = collisionInfo.transform;
// isColliding = true;
}
void OnCollisionExit(Collision collisionInfo)
{
// print("No longer in contact with " + collisionInfo.transform.name);
if (collisionInfo.transform.tag != "inventory" && collisionInfo.transform.tag != "ground")
{
renderer.material.color = Color.white;
isColliding = false;
other = collisionInfo.transform;
}
}
// TODO: use some other way..?
void Update()
{
if (rigidbody)
rigidbody.WakeUp();
}
}
Related Posts
9 Comments + Add Comment
Leave a comment to mgear
Recent posts
- Testing Unity AI Beta
- Ways to Support UnityCoder Development
- Using UI Slider to Create 5-Star Rating Element
- Game Music Library For Unity (editor plugin)
- Fontastic : Easily Test Fonts in Unity Editor!
- GeoTiff Importer & Terrain Generator for Unity
- Create Baked DropShadow for UI images
- .JP2 Ortho Image Converter to PNG/JPG/TIFF
- Convert LAS/LAZ/PLY pointclouds to GLTF (GLB) Point Meshes (standalone converter)
- Detect SRP (URP or HDRP) with Assembly Definition Version Defines
- [LudumDare57] Theme: Depths
- MotionVector Effect: Object “disappears” when paused
Recent Comments
- on [Asset Store] PolygonCollider2D Optimizer
- on Trajectory Test Scene 2.0
- on Vector3 maths for dummies!
- on UnityHub 3.6.0: Remove Version Control & Cloud Dashboard columns
- on Using RenderDoc with Unity (graphics debugger)
- on UI Scroll View automatic Content height
- on [Asset Store] Point Cloud Viewer & Tools
- on [Asset Store] Point Cloud Viewer & Tools
Coin:
CUgDSbRqFcAumDSAcdKDvuXsw26VdkJe8C8WGUQHBAGS
An article by













Inventory System & Editor Extension *free!* :
http://forum.unity3d.com/threads/197425-Unity-Inventory-System-amp-Editor-Extension-%28free%29
Discussion: Diablo style inventory (with some example sources)
http://forum.unity3d.com/threads/134298-Discussion-Diablo-style-inventory
open source inventory framework:
http://forum.unity3d.com/threads/240435-OpenStash-Open-source-inventory-framework-for-Unity
do you think i could have a copy of this?
script source added, quite a mess. It would be simple to do from scratch instead..(just raycasts & objects following mouse..)
thanks! looks so simple as well
public dragHelper dragHelperScript;
what is this?
^ added, sorry forgot it earlier.
thanks