|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
01.08.2013, 18:53
|
#1726
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Вопросы от новичка
Guiskin зачем придуман? Там есть размеры, настраиваешь и оляля - все норм, что бы случайно программно не сбить - флажок зафиксировать.
*/кто-нибудь кроме меня его юзает?
|
(Offline)
|
|
01.08.2013, 20:17
|
#1727
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
RegIon, как раз задавать фиксированные размеры я не хочу. Да и GUISkin для редактора из-за одного поля делать не хочется.
|
(Offline)
|
|
02.08.2013, 00:09
|
#1728
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
Задай фиксированный размер первой колонке и не парься
|
(Offline)
|
|
02.08.2013, 01:26
|
#1729
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
pax, ровно оно выходит только, если использовать и в шапке и в таблице GUILayout.Space(30).
Если в таблице писать как мне надо EditorGUILayout.Toggle(layer.active, GUILayout.Width(30)), то оно возьмет больше ширины.
Конечно можно подбирать нужные цифры, но это уже вообще не супер.
|
(Offline)
|
|
02.08.2013, 09:34
|
#1730
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
GUILayout.Space(30 + GUI.skin.toggle.padding.left + GUI.skin.toggle.padding.right);
или
GUILayout.Space(30 + GUI.skin.toggle.padding.horizontal);
|
(Offline)
|
|
02.08.2013, 17:25
|
#1731
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
pax, так правильно заработало.
GUILayout.Space(30+Mathf.Ceil(GUI.skin.toggle.padd ing.horizontal/2f))
Использовал Handles.FreeMoveHandle. Нужно было определить какой из этих шариков сейчас активный. Узнать это можно только использовав GUI.SetNextControlName и GetNameOfFocusedControl, что оказалось очень тормозным. Правда шариков у меня было 100.
Пришлось с помощью рефлекций добираться до внутреннего метода юнити. Вообщем вот что получилось
delegate Vector3 FreeMove(int id, Vector3 position, Quaternion rotation, float size, Vector3 snap, Handles.DrawCapFunction capFunc);
private static FreeMove freeMove;
static MyHandles() {
var assembly = Assembly.GetAssembly( typeof(Handles) );
Type type = assembly.GetType("UnityEditorInternal.FreeMove");
var method = type.GetMethod("Do");
freeMove = (FreeMove)Delegate.CreateDelegate( typeof(FreeMove), method );
}
Это чтобы можно было рисовать FreeMoveHandle, со своим ID. Ну а дальше генерирую свой id EditorGUIUtility.GetControlID(FocusType.Keyboard), рисую шарик и сверяю EditorGUIUtility.hotControl со своим ID.
Вот теперь думаю они вообще занимаются своим редактором?
Ведь достаточно было сделать возможность получить последний сгенерированный ID или сделать проверку на фокус последнего контрола.
|
(Offline)
|
|
05.08.2013, 18:52
|
#1732
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
Кто-нибудь делал, чтобы персонаж мог плавать?
Во первых нужно сделать, чтобы персонаж при всплытии не просто останавливался на уровне воды, а немного выпрыгивал из нее и еще немного колебался на воде.
Во вторых нужно сделать, чтобы когда персонаж просто плыл по воде, то тоже колебался на воде.
Чет как не делаю - все не нравится.
|
(Offline)
|
|
05.08.2013, 21:21
|
#1733
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от WISHMASTER35
Во первых нужно сделать, чтобы персонаж при всплытии не просто останавливался на уровне воды, а немного выпрыгивал из нее и еще
|
Может я не шарю, но нельзя это сделать на уровне анимации, а не программно? Сделать анимацию с выпрыгиванием, и проигрывать её при достижении уровня воды.
|
(Offline)
|
|
05.08.2013, 22:23
|
#1734
|
Бывалый
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений (для 880 пользователей)
|
Ответ: Вопросы от новичка
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
|
(Offline)
|
|
05.08.2013, 23:23
|
#1735
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
Lestar, вчера искал, но не нашел. Когда-то давно видел.
Andvrok, я пробовал кривыми настраивать силу выталкивания в зависимости от глубины погружения. Вообщем-то получалось тоже, что и без кривой.
Я думаю можно как-то создать амплитуду качания на воде. И увеличивать\уменьшать ее в зависимости от скорости. Но все это я слабо себе представляю и сделать не получается.
Кстати, лучше сделать затухание скорости? Если просто умножать на 0.95, то большая скорость уменьшается медленно, а маленькая скорость так и не доходит до нуля.
|
(Offline)
|
|
06.08.2013, 01:03
|
#1736
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Вопросы от новичка
На протяжении, допустим, десяти секунд, отнимаешь от скорости одну десятую её изначального значения. Например, если скорость 50 - то за 10 секунд уменьшаешь её до нуля по 5 в секунду; если скорость 162 - то за 10 секунд уменьшаешь её по 16.2 в секунду. Длительность тоже можно брать из скорости.
|
(Offline)
|
|
06.08.2013, 05:24
|
#1737
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от WISHMASTER35
Lestar, вчера искал, но не нашел. Когда-то давно видел.
Andvrok, я пробовал кривыми настраивать силу выталкивания в зависимости от глубины погружения. Вообщем-то получалось тоже, что и без кривой.
Я думаю можно как-то создать амплитуду качания на воде. И увеличивать\уменьшать ее в зависимости от скорости. Но все это я слабо себе представляю и сделать не получается.
Кстати, лучше сделать затухание скорости? Если просто умножать на 0.95, то большая скорость уменьшается медленно, а маленькая скорость так и не доходит до нуля.
|
Плавающие тела, переменная WaterY - высота воды.
// Buoyancy.cs // by Alex Zhdankin // Version 2.1 // // http://forum.unity3d.com/threads/72974-Buoyancy-script // // Terms of use: do whatever you like
using System.Collections.Generic; using UnityEngine;
public class Buoyancy : MonoBehaviour { // public Ocean ocean;
public float waterY=0f; public float density = 500; public int slicesPerAxis = 2; public bool isConcave = false; public int voxelsLimit = 16;
private const float DAMPFER = 0.1f; private const float WATER_DENSITY = 1000;
private float voxelHalfHeight; private Vector3 localArchimedesForce; private List<Vector3> voxels; private bool isMeshCollider; private List<Vector3[]> forces; // For drawing force gizmos
/// <summary> /// Provides initialization. /// </summary> private void Start() { forces = new List<Vector3[]>(); // For drawing force gizmos
// Store original rotation and position var originalRotation = transform.rotation; var originalPosition = transform.position; transform.rotation = Quaternion.identity; transform.position = Vector3.zero;
// The object must have a collider if (collider == null) { gameObject.AddComponent<MeshCollider>(); Debug.LogWarning(string.Format("[Buoyancy.cs] Object \"{0}\" had no collider. MeshCollider has been added.", name)); } isMeshCollider = GetComponent<MeshCollider>() != null;
var bounds = collider.bounds; if (bounds.size.x < bounds.size.y) { voxelHalfHeight = bounds.size.x; } else { voxelHalfHeight = bounds.size.y; } if (bounds.size.z < voxelHalfHeight) { voxelHalfHeight = bounds.size.z; } voxelHalfHeight /= 2 * slicesPerAxis;
// The object must have a RidigBody if (rigidbody == null) { gameObject.AddComponent<Rigidbody>(); Debug.LogWarning(string.Format("[Buoyancy.cs] Object \"{0}\" had no Rigidbody. Rigidbody has been added.", name)); } rigidbody.centerOfMass = new Vector3(0, -bounds.extents.y * 0f, 0) + transform.InverseTransformPoint(bounds.center);
voxels = SliceIntoVoxels(isMeshCollider && isConcave);
// Restore original rotation and position transform.rotation = originalRotation; transform.position = originalPosition;
float volume = rigidbody.mass / density;
WeldPoints(voxels, voxelsLimit);
float archimedesForceMagnitude = WATER_DENSITY * Mathf.Abs(Physics.gravity.y) * volume; localArchimedesForce = new Vector3(0, archimedesForceMagnitude, 0) / voxels.Count;
Debug.Log(string.Format("[Buoyancy.cs] Name=\"{0}\" volume={1:0.0}, mass={2:0.0}, density={3:0.0}", name, volume, rigidbody.mass, density)); }
/// <summary> /// Slices the object into number of voxels represented by their center points. /// <param name="concave">Whether the object have a concave shape.</param> /// <returns>List of voxels represented by their center points.</returns> /// </summary> private List<Vector3> SliceIntoVoxels(bool concave) { var points = new List<Vector3>(slicesPerAxis * slicesPerAxis * slicesPerAxis);
if (concave) { var meshCol = GetComponent<MeshCollider>();
var convexValue = meshCol.convex; meshCol.convex = false;
// Concave slicing var bounds = collider.bounds; for (int ix = 0; ix < slicesPerAxis; ix++) { for (int iy = 0; iy < slicesPerAxis; iy++) { for (int iz = 0; iz < slicesPerAxis; iz++) { float x = bounds.min.x + bounds.size.x / slicesPerAxis * (0.5f + ix); float y = bounds.min.y + bounds.size.y / slicesPerAxis * (0.5f + iy); float z = bounds.min.z + bounds.size.z / slicesPerAxis * (0.5f + iz);
var p = transform.InverseTransformPoint(new Vector3(x, y, z));
if (PointIsInsideMeshCollider(meshCol, p)) { points.Add(p); } } } } if (points.Count == 0) { points.Add(bounds.center); }
meshCol.convex = convexValue; } else { // Convex slicing var bounds = GetComponent<Collider>().bounds; for (int ix = 0; ix < slicesPerAxis; ix++) { for (int iy = 0; iy < slicesPerAxis; iy++) { for (int iz = 0; iz < slicesPerAxis; iz++) { float x = bounds.min.x + bounds.size.x / slicesPerAxis * (0.5f + ix); float y = bounds.min.y + bounds.size.y / slicesPerAxis * (0.5f + iy); float z = bounds.min.z + bounds.size.z / slicesPerAxis * (0.5f + iz);
var p = transform.InverseTransformPoint(new Vector3(x, y, z));
points.Add(p); } } } }
return points; }
/// <summary> /// Returns whether the point is inside the mesh collider. /// </summary> /// <param name="c">Mesh collider.</param> /// <param name="p">Point.</param> /// <returns>True - the point is inside the mesh collider. False - the point is outside of the mesh collider. </returns> private static bool PointIsInsideMeshCollider(Collider c, Vector3 p) { Vector3[] directions = { Vector3.up, Vector3.down, Vector3.left, Vector3.right, Vector3.forward, Vector3.back };
foreach (var ray in directions) { RaycastHit hit; if (c.Raycast(new Ray(p - ray * 1000, ray), out hit, 1000f) == false) { return false; } }
return true; }
/// <summary> /// Returns two closest points in the list. /// </summary> /// <param name="list">List of points.</param> /// <param name="firstIndex">Index of the first point in the list. It's always less than the second index.</param> /// <param name="secondIndex">Index of the second point in the list. It's always greater than the first index.</param> private static void FindClosestPoints(IList<Vector3> list, out int firstIndex, out int secondIndex) { float minDistance = float.MaxValue, maxDistance = float.MinValue; firstIndex = 0; secondIndex = 1;
for (int i = 0; i < list.Count - 1; i++) { for (int j = i + 1; j < list.Count; j++) { float distance = Vector3.Distance(list[i], list[j]); if (distance < minDistance) { minDistance = distance; firstIndex = i; secondIndex = j; } if (distance > maxDistance) { maxDistance = distance; } } } }
/// <summary> /// Welds closest points. /// </summary> /// <param name="list">List of points.</param> /// <param name="targetCount">Target number of points in the list.</param> private static void WeldPoints(IList<Vector3> list, int targetCount) { if (list.Count <= 2 || targetCount < 2) { return; }
while (list.Count > targetCount) { int first, second; FindClosestPoints(list, out first, out second);
var mixed = (list[first] + list[second]) * 0.5f; list.RemoveAt(second); // the second index is always greater that the first => removing the second item first list.RemoveAt(first); list.Add(mixed); } }
/// <summary> /// Returns the water level at given location. /// </summary> /// <param name="x">x-coordinate</param> /// <param name="z">z-coordinate</param> /// <returns>Water level</returns> private float GetWaterLevel(float x, float z) { // return ocean == null ? 0.0f : ocean.GetWaterHeightAtLocation(x, z); return waterY; }
/// <summary> /// Calculates physics. /// </summary> private void FixedUpdate() { forces.Clear(); // For drawing force gizmos
foreach (var point in voxels) { var wp = transform.TransformPoint(point); float waterLevel = GetWaterLevel(wp.x, wp.z);
if (wp.y - voxelHalfHeight < waterLevel) { float k = (waterLevel - wp.y) / (2 * voxelHalfHeight) + 0.5f; if (k > 1) { k = 1f; } else if (k < 0) { k = 0f; }
var velocity = rigidbody.GetPointVelocity(wp); var localDampingForce = -velocity * DAMPFER * rigidbody.mass; var force = localDampingForce + Mathf.Sqrt(k) * localArchimedesForce; rigidbody.AddForceAtPosition(force, wp);
forces.Add(new[] { wp, force }); // For drawing force gizmos } } }
/// <summary> /// Draws gizmos. /// </summary> private void OnDrawGizmos() { if (voxels == null || forces == null) { return; }
const float gizmoSize = 0.05f; Gizmos.color = Color.yellow;
foreach (var p in voxels) { Gizmos.DrawCube(transform.TransformPoint(p), new Vector3(gizmoSize, gizmoSize, gizmoSize)); }
Gizmos.color = Color.cyan;
foreach (var force in forces) { Gizmos.DrawCube(force[0], new Vector3(gizmoSize, gizmoSize, gizmoSize)); Gizmos.DrawLine(force[0], force[0] + force[1] / rigidbody.mass); } } }
Юзай http://forum.unity3d.com/attachment....6&d=1294425510
Только перепиши немного, а то там уровень воды постоянно на 0,0,0 , не помню какая переменная.
Думаю силы к фИЗ телам прилагать умеешь .
Для колебаний - делай псевдослучайные толчки ввверх или вниз, ну или волны, на уровне меша и колайдера
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.08.2013, 11:40
|
#1738
|
Бывалый
Регистрация: 03.12.2008
Адрес: наша раша
Сообщений: 762
Написано 129 полезных сообщений (для 245 пользователей)
|
Ответ: Вопросы от новичка
Извините, хочу уточнить для себя некоторые моменты про плагины с dll - http://docs.unity3d.com/Documentatio...l/Plugins.html. Насколько я понял внешние библиотеки, оформленные в виде внешних dll , можно использовать только с ПРО-версией? И следовательно платные плагины от известных производителей (например PRIME ) можно использовать тоже только в ПРО-версиях? Или я ошибаюсь?
__________________
Reality Simulation Games
Core 2 Duo 2,8GHz, RAM 1Gb, ATI R5670 1Gb. WinXP 32
|
(Offline)
|
|
11.08.2013, 11:49
|
#1739
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Вопросы от новичка
Подавляющее большинство платных плагинов написано на шарпе. Для них не нужна ПРО. Плагины про которые говорится по ссылке, и которые только для ПРО написаны на нативном языке (C++ и подобные).
Скорее всего и PRIME написан на шарпе. Следовательно для его использования не нужно ПРО, если там, конечно, не используются другие фишки ПРО.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.08.2013, 11:56
|
#1740
|
Бывалый
Регистрация: 03.12.2008
Адрес: наша раша
Сообщений: 762
Написано 129 полезных сообщений (для 245 пользователей)
|
Ответ: Вопросы от новичка
Например плагин для гейм-центра от прайм31 - http://prime31.com/docs#iosGameCenter, нужна ПРО- версия или нет?
__________________
Reality Simulation Games
Core 2 Duo 2,8GHz, RAM 1Gb, ATI R5670 1Gb. WinXP 32
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:25.
|