bbautista Posted December 9, 2016 Report Posted December 9, 2016 Hey guys I just found a good asset to use with Atavism. Lets keep this thread going. If you know of any assets that can be used with atavism that doesnt break it..please paste the link store address below. Heres mine Compass Navigator Pro (works well drop and go) https://www.assetstore.unity3d.com/en/?utm_source=assetstore&utm_medium=text&utm_campaign=as_global_acquisition_2016-12-global-homepage-interstitial-new-user-dismiss#!/content/59519 Quote
MMODeveloper Posted December 9, 2016 Report Posted December 9, 2016 UniStorm is my all time Favorite asset to use... Just need to write some server side glue code to sync the cycle, generate weather, and sync the weather... Could even handle keeping track of the day, seasons, ect. on the server for use in generating the weather and keeping it all synced. https://www.assetstore.unity3d.com/en/#!/content/2714 The Code for updating it is pretty simple... Run this once every second... Will result in a 40 minute cycle I believe... class EnvironmentTick implements Runnable{ @Override public void run() { seconds = seconds + 1; if(startTime >= 1) seconds = 0; //startTime = (seconds / 86400); startTime = (seconds / 2400); } } Run this every 15 minutes or however often you want to sync the cycle with the clients: class EnvironmentSync implements Runnable{ @Override public void run() { for (int i = 0; i < Oids.size(); i++) { OID objOid = Oids.get(i); HashMap props = new HashMap(); props.put("ext_msg_subtype", "Env.Sync"); props.put("startTime", startTime); props.put("year", Year); props.put("month", Month); props.put("day", Day); props.put("weather", weather); TargetedExtensionMessage _msg = new TargetedExtensionMessage(WorldManagerClient.MSG_TYPE_EXTENSION, objOid, objOid, false, props); Engine.getAgent().sendBroadcast(_msg); } //Log.debug("EnvironmentPlugin: " + String.valueOf(startTime)); } } Run this every 15 minutes or however often you want to potentially generate weather... This was just a test at giving different months a different percentage of generating weather so at the moment I only have December being used... Did have a real time Day/Night cycle based on the day, month, year, and time of the server when I wrote this code. This code also forces a Change in weather if more then an hour has passed since the last time it changed. class ChangeWeather implements Runnable{ @Override public void run() { // TODO Auto-generated method stub int percent = GetRandom(0, 100); if(Month == 12) { if(percent <= 25 || forceWeatherChange >= 4){ weather = GetRandom(1, 11); BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } forceWeatherChange++; } } Quote
Smithor Posted December 11, 2016 Report Posted December 11, 2016 Definitely Terrain Composer 2 http://www.terraincomposer.com. Super simple system for making good looking terrains, quickly, easily, and without hassle. I cannot handle the Unity terrain editing process, and was so disappointed that I might have had to make everything externally and plug it in. But this program makes it so I do not need to do that, and have been using it happily for several months. It's a new program so it has some bugs, but it's worth it. Quote
UltraTM Posted December 13, 2016 Report Posted December 13, 2016 Hey James, would be nice if you could make a tutorial maybe for using Unistorm. Would love to test it. As far as im not a coder it's difficult to know where to put which code Quote
Aizen Posted December 31, 2016 Report Posted December 31, 2016 any one tested Footstep System https://www.assetstore.unity3d.com/en/#!/content/63066 ? Quote
darkrurik Posted February 23, 2017 Report Posted February 23, 2017 MMODeveloper excuses I concern to the code that I want Sincronize to the put for managing the time in unistorm I don't find the file where I must put this code or I must create one file of mine we are to the version 2.3.1 thanks Quote
darkrurik Posted February 23, 2017 Report Posted February 23, 2017 Resolve: TimeManager: using UnityEngine; using System.Collections; using System.Collections.Generic; public class TimeManager : MonoBehaviour { static TimeManager instance; public string timeGameObjectName; int day; int hour; int minute; float second = -1; int worldTimeSpeed = 1; string currentTime = ""; float delay = 3; float updateTime = -1; float lastFrameTime = -1; // Use this for initialization void Start () { instance = this; NetworkAPI.RegisterExtensionMessageHandler("server_time", ServerTimeMessage); } // Update is called once per frame void Update () { if (second == -1) return; // Recalculate the current time second += (Time.realtimeSinceStartup - lastFrameTime) * worldTimeSpeed; lastFrameTime = Time.realtimeSinceStartup; if (second >= 60) { int minutesPassed = (int)second / 60; second -= 60 * minutesPassed; minute += minutesPassed; if (minute >= 60) { minute -= 60; hour += 1; } if (hour >= 24) { hour -= 24; day += 1; } // Send out a time update message since the minute/hour has changed string[] args = new string[1]; AtavismEventSystem.DispatchEvent("WORLD_TIME_UPDATE", args); //Debug.Log("Time is now: " + hour + ":" + minute + " with deltaTime: " + Time.deltaTime + " and minutesPassed: " + minutesPassed); } if (timeGameObjectName != "" && updateTime != -1 && Time.time > updateTime) { GameObject timeReqGameObject = GameObject.Find(timeGameObjectName); if (timeReqGameObject != null) { timeReqGameObject.SendMessage("SetSecond", second); timeReqGameObject.SendMessage("SetMinute", minute); timeReqGameObject.SendMessage("SetHour", hour); timeReqGameObject.SendMessage("SetDay", day); } updateTime = -1; } } public void ServerTimeMessage(Dictionary props) { day = (int)props["day"]; hour = (int)props["hour"]; minute = (int)props["minute"]; second = (int)props["second"]; worldTimeSpeed = (int)props["worldTimeSpeed"]; //Debug.Log("Got Server Time Message with Day: " + day + ", hour: " + hour + ". minute: " + minute); lastFrameTime = Time.realtimeSinceStartup; updateTime = Time.time + delay; } public static TimeManager Instance { get { return instance; } } public string CurrentTime { get { return currentTime; } } public int Hour { get { return hour; } } public int Minute { get { return minute; } } public float Second { get { return second; } } public int Day { get { return day; } } } UGUIWorldTimeDisplayPersonal: using UnityEngine; using System; using UnityEngine.UI; using System.Collections; public class UGUIWorldTimeDisplayPersonal : MonoBehaviour { // public GameObject uniStormSystem; // public string day; // public int Month; // public int Year; // public string hour; // public string minute; // public string second; // public string timeText; // public string dateText; // void Awake() { // uniStormSystem = GameObject.Find("UniStormSystemEditor"); // } // // Use this for initialization // void Start () { // AtavismEventSystem.RegisterEvent("WORLD_TIME_UPDATE", this); // Month = System.DateTime.Now.Month; // Year = System.DateTime.Now.Year; // uniStormSystem.GetComponent().monthCounter = Month; // uniStormSystem.GetComponent().yearCounter = Year; // UpdateTimeDisplay(); // } // // Update is called once per frame // void Update() { // dateText = System.DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"); // UpdateTimeDisplay(); // } // void OnDestroy() { // AtavismEventSystem.UnregisterEvent("WORLD_TIME_UPDATE", this); // } // public void OnEvent(AtavismEventData eData) { // if (eData.eventType == "WORLD_TIME_UPDATE") { // UpdateTimeDisplay(); // } // } // void UpdateTimeDisplay() { // if (timeText != null) { // // Get time from the time system and set it to the text // hour = TimeManager.Instance.Hour.ToString(); // if (TimeManager.Instance.Hour < 10) { // hour = "0" + hour; // } // minute = TimeManager.Instance.Minute.ToString(); // if (TimeManager.Instance.Minute < 10) { // minute = "0" + minute; // } // second = TimeManager.Instance.Second.ToString(); // if (TimeManager.Instance.Second < 10) { // second = "0" + second; // } // day = TimeManager.Instance.Day.ToString(); // timeText = day + " / " + hour + ":" + minute + ":" + second; // //Hour = uniStormSystem.GetComponent().hourCounter; // uniStormSystem.GetComponent().dayCounter = TimeManager.Instance.Day; // uniStormSystem.GetComponent().hourCounter = TimeManager.Instance.Hour; // uniStormSystem.GetComponent().minuteCounter = TimeManager.Instance.Minute; // } // } // } Quote
Ninlilizi Posted February 25, 2017 Report Posted February 25, 2017 Granite - An asset for realtime texture streaming works out the box if your using the standard shaders. Cut's scene load times right down. https://www.assetstore.unity3d.com/en/#!/content/51026 Quote
Aizen Posted May 4, 2017 Report Posted May 4, 2017 can we get script update for Unistorm 2.4 :dry: Thanks! Quote
MMODeveloper Posted May 4, 2017 Report Posted May 4, 2017 The Code I posted is Server side and should work for any version of UniStorm. You may just have to make some changes to UniStorm such as remove the code in UniStorm for deciding the weather and things like that. Quote
MMODeveloper Posted May 5, 2017 Report Posted May 5, 2017 With my Setup The Server generates the Random Weather and syncs all the Clients. Quote
MMODeveloper Posted May 5, 2017 Report Posted May 5, 2017 class ChangeWeather implements Runnable{ @Override public void run() { // TODO Auto-generated method stub int percent = GetRandom(0, 100); if(Month == 12) { if(percent <= 25 || forceWeatherChange >= 4){ weather = GetRandom(1, 11); BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } forceWeatherChange++; } } That code right there generates the weather. You would have to finish filling it out for every month as at the moment it only handles December. With that you can give each month it's own percentage chance of changing weather. Here is the actual code I am using which handles all months grouped in seasons. Each month has it's own chances of storms and storms progress in natural fashion from cloudy to foggy to light precip to heavier precip and at any stage there is a chance it clears up and never advances any further. It creates a very realistic weather system. class ChangeWeather implements Runnable{ @Override public void run() { // TODO Auto-generated method stub int percent = GetRandom(0, 100); int advance = 0; if(Month == 1 || Month == 2 || Month == 3 || Month == 11 || Month == 12) { season = Seasons.Winter; Temperature = 32; if(percent <= 45 || forceWeatherChange >= 4){ if(weather == 1) { advance = GetRandom(0, 100); if(advance <= 50) weather = 2; else weather = 7; } else if(weather == 2) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = 7; } else if(weather == 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = 7; } else if(weather > 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 1; else weather = 7; } BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } else if(Month == 4 || Month == 5) { season = Seasons.Spring; Temperature = 60; if(percent <= 90 || forceWeatherChange >= 4){ if(weather == 1) { advance = GetRandom(0, 100); if(advance <= 50) weather = 2; else weather = GetRandom(4, 6); } else if(weather == 2) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather == 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather > 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 1; else weather = GetRandom(4, 6); } BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } else if(Month == 6 || Month == 7 || Month == 8) { season = Seasons.Summer; Temperature = 90; if(percent <= 75 || forceWeatherChange >= 4){ if(weather == 1) { advance = GetRandom(0, 100); if(advance <= 50) weather = 2; else weather = GetRandom(4, 6); } else if(weather == 2) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather == 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather > 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 1; else weather = GetRandom(4, 6); } BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } else if(Month == 9 || Month == 10) { season = Seasons.Fall; Temperature = 50; if(percent <= 40 || forceWeatherChange >= 4){ if(weather == 1) { advance = GetRandom(0, 100); if(advance <= 50) weather = 2; else weather = GetRandom(4, 6); } else if(weather == 2) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather == 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather > 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 1; else weather = GetRandom(4, 6); } BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } forceWeatherChange++; } } Quote
Aizen Posted May 5, 2017 Report Posted May 5, 2017 whery nice . thes code go in TimeManager? and what shod i do for auto player setup camera type ??? player object ??? was long time sens i test Unistorm Quote
MMODeveloper Posted May 5, 2017 Report Posted May 5, 2017 You will need the Server side Plugin code which everyone should now have access to. You will need to create a whole new Plugin in your server project and set it up to load with the server. Here is my full EnvironmentPlugin class. package MMOI.agis.plugins; import java.io.Serializable; import java.sql.Time; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.Random; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import com.sun.javafx.collections.MappingChange.Map; import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List; import atavism.msgsys.Message; import atavism.msgsys.MessageTypeFilter; import atavism.server.engine.*; import atavism.server.plugins.WorldManagerClient; import atavism.server.plugins.WorldManagerClient.ExtensionMessage; import atavism.server.plugins.WorldManagerClient.TargetedExtensionMessage; import atavism.server.util.LockFactory; import atavism.server.util.Log; import atavism.server.util.Logger; public class EnvironmentPlugin extends EnginePlugin { public static int CYCLE_SPEED = 7200; public EnvironmentPlugin(){ super(ENVIRONMENT_PLUGIN_NAME); setPluginType("Environment"); } public static String ENVIRONMENT_PLUGIN_NAME = "EnvironmentPlugin"; //protected static final Logger log = new Logger("EnvironmentPlugin"); protected static Lock lock = LockFactory.makeLock("EnvironmentPlugin"); public String getName() { return ENVIRONMENT_PLUGIN_NAME; } public void onActivate(){ seconds = 3600; Calendar cal = Calendar.getInstance(); Month = 1; Day = 1; Year = 1000; registerHooks(); } protected void registerHooks(){ getHookManager().addHook(WorldManagerClient.MSG_TYPE_SPAWNED, new SpawnedHook()); MessageTypeFilter filter = new MessageTypeFilter(); filter.addType(WorldManagerClient.MSG_TYPE_SPAWNED); Engine.getAgent().createSubscription(filter, this); Engine.getExecutor().scheduleAtFixedRate(envTick, 0, 1, TimeUnit.SECONDS); Engine.getExecutor().scheduleAtFixedRate(envSync, 0, 5, TimeUnit.SECONDS); Engine.getExecutor().scheduleAtFixedRate(changeWeather, 0, 15, TimeUnit.MINUTES); Log.debug("EnvironmentPlugin.onActivate() completed"); } class SpawnedHook implements Hook { @Override public boolean processMessage(Message msg, int arg1) { // TODO Auto-generated method stub WorldManagerClient.SpawnedMessage spawnedMsg = (WorldManagerClient.SpawnedMessage) msg; OID objOid = spawnedMsg.getSubject(); if(!Oids.contains(objOid)) Oids.add(objOid); HashMap props = new HashMap(); props.put("ext_msg_subtype", "Env.Sync"); props.put("startTime", startTime); props.put("year", Year); props.put("month", Month); props.put("day", Day); props.put("weather", weather); props.put("cycle_speed", CYCLE_SPEED); props.put("temp", Temperature); TargetedExtensionMessage _msg = new TargetedExtensionMessage(WorldManagerClient.MSG_TYPE_EXTENSION, objOid, objOid, false, props); Engine.getAgent().sendBroadcast(_msg); return true; } } ArrayList Oids = new ArrayList(); float Hour; float startTime; float dayLengthHour = 6; float nightLengthHour = 18; float dayLength = 10; float nightLength = 10; float Milisecond = 1; float SECOND = 1; float MINUTE = SECOND * 60; float HOUR = MINUTE * 60; float DAY = HOUR * 24; float seconds = 1; int Month; int Day; int Year; int weather = 8; float Temperature = 0f; int GetRandom(int minimum, int maximum){ return minimum + (int)(Math.random() * maximum); } class EnvironmentTick implements Runnable{ @Override public void run() { seconds = seconds + 1; if(startTime >= 1) { seconds = 0; Day++; if(Day > 30) { Day = 0; Month++; if(Month > 12) { Month = 1; Year++; } } } startTime = (seconds / CYCLE_SPEED); } } class EnvironmentSync implements Runnable{ @Override public void run() { for (int i = 0; i < Oids.size(); i++) { OID objOid = Oids.get(i); HashMap props = new HashMap(); props.put("ext_msg_subtype", "Env.Sync"); props.put("startTime", startTime); props.put("year", Year); props.put("month", Month); props.put("day", Day); props.put("weather", weather); props.put("cycle_speed", CYCLE_SPEED); props.put("temp", Temperature); TargetedExtensionMessage _msg = new TargetedExtensionMessage(WorldManagerClient.MSG_TYPE_EXTENSION, objOid, objOid, false, props); Engine.getAgent().sendBroadcast(_msg); } } } class GetDate implements Runnable{ @Override public void run() { Calendar cal = Calendar.getInstance(); // TODO Auto-generated method stub Month = cal.get(Calendar.MONTH) + 1; Day = cal.get(Calendar.DAY_OF_MONTH); Year = cal.get(Calendar.YEAR); } } void BroadcastWeatherEvent(){ for (int i = 0; i < Oids.size(); i++) { OID objOid = Oids.get(i); HashMap props = new HashMap(); props.put("ext_msg_subtype", "Env.WeatherGenerated"); props.put("weather", weather); TargetedExtensionMessage _msg = new TargetedExtensionMessage(WorldManagerClient.MSG_TYPE_EXTENSION, objOid, objOid, false, props); Engine.getAgent().sendBroadcast(_msg); } } int forceWeatherChange = 0; enum Seasons{ Winter, Spring, Summer, Fall } Seasons season = Seasons.Winter; class ChangeWeather implements Runnable{ @Override public void run() { // TODO Auto-generated method stub int percent = GetRandom(0, 100); int advance = 0; if(Month == 1 || Month == 2 || Month == 3 || Month == 11 || Month == 12) { season = Seasons.Winter; Temperature = 32; if(percent <= 45 || forceWeatherChange >= 4){ if(weather == 1) { advance = GetRandom(0, 100); if(advance <= 50) weather = 2; else weather = 7; } else if(weather == 2) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = 7; } else if(weather == 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = 7; } else if(weather > 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 1; else weather = 7; } BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } else if(Month == 4 || Month == 5) { season = Seasons.Spring; Temperature = 60; if(percent <= 90 || forceWeatherChange >= 4){ if(weather == 1) { advance = GetRandom(0, 100); if(advance <= 50) weather = 2; else weather = GetRandom(4, 6); } else if(weather == 2) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather == 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather > 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 1; else weather = GetRandom(4, 6); } BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } else if(Month == 6 || Month == 7 || Month == 8) { season = Seasons.Summer; Temperature = 90; if(percent <= 75 || forceWeatherChange >= 4){ if(weather == 1) { advance = GetRandom(0, 100); if(advance <= 50) weather = 2; else weather = GetRandom(4, 6); } else if(weather == 2) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather == 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather > 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 1; else weather = GetRandom(4, 6); } BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } else if(Month == 9 || Month == 10) { season = Seasons.Fall; Temperature = 50; if(percent <= 40 || forceWeatherChange >= 4){ if(weather == 1) { advance = GetRandom(0, 100); if(advance <= 50) weather = 2; else weather = GetRandom(4, 6); } else if(weather == 2) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather == 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 3; else weather = GetRandom(4, 6); } else if(weather > 3) { advance = GetRandom(0, 100); if(advance <= 50) weather = 1; else weather = GetRandom(4, 6); } BroadcastWeatherEvent(); forceWeatherChange = 0; return; } } forceWeatherChange++; } } // Environment Tick: Advances the Day/Night Cycles and the Calendar. EnvironmentTick envTick = new EnvironmentTick(); // Environment Sync: Used for syncing the Cycle with the clients EnvironmentSync envSync = new EnvironmentSync(); // Change Weather: Responsible for Generating Weather ChangeWeather changeWeather = new ChangeWeather(); } On Client Side I made the UniStorm class a singleton so I could access it from anywhere (Looking at my code I guess this version of it I didn't but usually I do and I would recommend it!). Then I created a EnvironmentHandler class which handles receiving the messages from the server and syncing UniStorm. using UnityEngine; using System.Collections; using System.Collections.Generic; public class EnvironmentHandler : MonoBehaviour { // Use this for initialization void Start () { NetworkAPI.RegisterExtensionMessageHandler("Env.Sync", HandleSync); NetworkAPI.RegisterExtensionMessageHandler("Env.WeatherGenerated", this.HandleWeatherGenerated); } // Update is called once per frame void Update () { } void HandleSync(Dictionary props) { float startTime = (float)props["startTime"]; int year = (int)props["year"]; int month = (int)props["month"]; int day = (int)props["day"]; int weather = (int)props["weather"]; int cycle_speed = (int)props["cycle_speed"]; float temp = (float)props["temp"]; StartCoroutine(DoSync(startTime, year, month, day, weather, cycle_speed, temp)); } void HandleWeatherGenerated(Dictionary props) { int weather = (int)props["weather"]; UniStormWeatherSystem_C uniStorm = GameObject.FindObjectOfType(); if (uniStorm != null) { uniStorm.weatherForecaster = weather; //Debug.LogError("Generated Weather: " + weather.ToString()); } else { //Debug.LogError("UNISTORM not found!"); } } IEnumerator DoSync(float startTime, int year, int month, int day, int weather, int speed, float temp) { yield return new WaitForSeconds(0.1f); UniStormWeatherSystem_C uniStorm = GameObject.FindObjectOfType(); if(uniStorm != null) { uniStorm.startTime = startTime; uniStorm.yearCounter = year; uniStorm.monthCounter = month; uniStorm.dayCounter = day; uniStorm.weatherForecaster = weather; UniStormWeatherSystem_C.CYCLE_SPEED = speed; uniStorm.temperature = (int)temp; } else { //Debug.LogError("UNISTORM not found!"); } } } I made a generic script which has the gameobject it's attached to follow the player so then I could attach it to the UniStorm base object and it will follow the player around. Something like is only needed for larger seamless worlds. If you have smaller zones then depending on the size of your zones you shouldn't have any issue just centering UniStorm on your zone. For this script all I did was get the Object's Transform and the Player's Transform and set the Object's transform position to that of the player's transform position every frame. Or you could even put it inside a repeated invoke method and invoke it every few seconds though I haven't tested it to see if the jump would be noticeable. How I have everything else set up I'm honestly not sure. It's been a while. I've upgraded to the latest version of Unity and so I've been unable to do anything with Atavism since. Andrew just posted a fix but I believe it's for the latest test release of Atavism 2.7 which until the known bugs are dealt with I'm not willing to upgrade to it yet. With the latest stable version of Atavism there is all kinds of issues with UMA with the latest release of Unity. Quote
Morlock Posted June 21, 2017 Report Posted June 21, 2017 might it be possible if you could do a video on the unistorm setup? Quote
TimSpurgeons Posted September 28, 2017 Report Posted September 28, 2017 Hello and thank you for sharing this. The client side script you have is it just attached to a gsmeobject in the scene. I am very interested in this as I just purchased unistorm. Is this all we need to get this working or are there any other things I don't mind paying to get this working. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.