forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

RegIon 01.08.2013 18:53

Ответ: Вопросы от новичка
 
Guiskin зачем придуман? Там есть размеры, настраиваешь и оляля - все норм, что бы случайно программно не сбить - флажок зафиксировать.
*/кто-нибудь кроме меня его юзает?

WISHMASTER35 01.08.2013 20:17

Ответ: Вопросы от новичка
 
RegIon, как раз задавать фиксированные размеры я не хочу. Да и GUISkin для редактора из-за одного поля делать не хочется.

pax 02.08.2013 00:09

Ответ: Вопросы от новичка
 
Задай фиксированный размер первой колонке и не парься

WISHMASTER35 02.08.2013 01:26

Ответ: Вопросы от новичка
 
pax, ровно оно выходит только, если использовать и в шапке и в таблице GUILayout.Space(30).
Если в таблице писать как мне надо EditorGUILayout.Toggle(layer.active, GUILayout.Width(30)), то оно возьмет больше ширины.
Конечно можно подбирать нужные цифры, но это уже вообще не супер.

pax 02.08.2013 09:34

Ответ: Вопросы от новичка
 
GUILayout.Space(30 + GUI.skin.toggle.padding.left + GUI.skin.toggle.padding.right);

или

GUILayout.Space(30 + GUI.skin.toggle.padding.horizontal);

WISHMASTER35 02.08.2013 17:25

Ответ: Вопросы от новичка
 
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 или сделать проверку на фокус последнего контрола.

WISHMASTER35 05.08.2013 18:52

Ответ: Вопросы от новичка
 
Кто-нибудь делал, чтобы персонаж мог плавать?
Во первых нужно сделать, чтобы персонаж при всплытии не просто останавливался на уровне воды, а немного выпрыгивал из нее и еще немного колебался на воде.
Во вторых нужно сделать, чтобы когда персонаж просто плыл по воде, то тоже колебался на воде.
Чет как не делаю - все не нравится.

Andvrok 05.08.2013 21:21

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 264875)
Во первых нужно сделать, чтобы персонаж при всплытии не просто останавливался на уровне воды, а немного выпрыгивал из нее и еще

Может я не шарю, но нельзя это сделать на уровне анимации, а не программно? Сделать анимацию с выпрыгиванием, и проигрывать её при достижении уровня воды.

Lestar 05.08.2013 22:23

Ответ: Вопросы от новичка
 
Смотрел?

WISHMASTER35 05.08.2013 23:23

Ответ: Вопросы от новичка
 
Lestar, вчера искал, но не нашел. Когда-то давно видел.
Andvrok, я пробовал кривыми настраивать силу выталкивания в зависимости от глубины погружения. Вообщем-то получалось тоже, что и без кривой.

Я думаю можно как-то создать амплитуду качания на воде. И увеличивать\уменьшать ее в зависимости от скорости. Но все это я слабо себе представляю и сделать не получается.

Кстати, лучше сделать затухание скорости? Если просто умножать на 0.95, то большая скорость уменьшается медленно, а маленькая скорость так и не доходит до нуля.

Andvrok 06.08.2013 01:03

Ответ: Вопросы от новичка
 
На протяжении, допустим, десяти секунд, отнимаешь от скорости одну десятую её изначального значения. Например, если скорость 50 - то за 10 секунд уменьшаешь её до нуля по 5 в секунду; если скорость 162 - то за 10 секунд уменьшаешь её по 16.2 в секунду. Длительность тоже можно брать из скорости.

RegIon 06.08.2013 05:24

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 264888)
Lestar, вчера искал, но не нашел. Когда-то давно видел.
Andvrok, я пробовал кривыми настраивать силу выталкивания в зависимости от глубины погружения. Вообщем-то получалось тоже, что и без кривой.

Я думаю можно как-то создать амплитуду качания на воде. И увеличивать\уменьшать ее в зависимости от скорости. Но все это я слабо себе представляю и сделать не получается.

Кстати, лучше сделать затухание скорости? Если просто умножать на 0.95, то большая скорость уменьшается медленно, а маленькая скорость так и не доходит до нуля.

Плавающие тела, переменная WaterY - высота воды.

PHP код:

// 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 , не помню какая переменная.

Думаю силы к фИЗ телам прилагать умеешь .
Для колебаний - делай псевдослучайные толчки ввверх или вниз, ну или волны, на уровне меша и колайдера

Morganolla 11.08.2013 11:40

Ответ: Вопросы от новичка
 
Извините, хочу уточнить для себя некоторые моменты про плагины с dll - http://docs.unity3d.com/Documentatio...l/Plugins.html. Насколько я понял внешние библиотеки, оформленные в виде внешних dll , можно использовать только с ПРО-версией? И следовательно платные плагины от известных производителей (например PRIME ) можно использовать тоже только в ПРО-версиях? Или я ошибаюсь?

seaman 11.08.2013 11:49

Ответ: Вопросы от новичка
 
Подавляющее большинство платных плагинов написано на шарпе. Для них не нужна ПРО. Плагины про которые говорится по ссылке, и которые только для ПРО написаны на нативном языке (C++ и подобные).
Скорее всего и PRIME написан на шарпе. Следовательно для его использования не нужно ПРО, если там, конечно, не используются другие фишки ПРО.

Morganolla 11.08.2013 11:56

Ответ: Вопросы от новичка
 
Например плагин для гейм-центра от прайм31 - http://prime31.com/docs#iosGameCenter, нужна ПРО- версия или нет?


Часовой пояс GMT +4, время: 01:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot