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<
Vector3voxels;
    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.bounds.size.y)
        {
            
voxelHalfHeight bounds.size.x;
        }
        else
        {
            
voxelHalfHeight bounds.size.y;
        }
        if (
bounds.size.voxelHalfHeight)
        {
            
voxelHalfHeight bounds.size.z;
        }
        
voxelHalfHeight /= 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.0f0) + 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(voxelsvoxelsLimit);

        
float archimedesForceMagnitude WATER_DENSITY Mathf.Abs(Physics.gravity.y) * volume;
        
localArchimedesForce = new Vector3(0archimedesForceMagnitude0) / voxels.Count;

        
Debug.Log(string.Format("[Buoyancy.cs] Name=\"{0}\" volume={1:0.0}, mass={2:0.0}, density={3:0.0}"namevolumerigidbody.massdensity));
    }

    
/// <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<Vector3SliceIntoVoxels(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 0ix slicesPerAxisix++)
            {
                for (
int iy 0iy slicesPerAxisiy++)
                {
                    for (
int iz 0iz slicesPerAxisiz++)
                    {
                        
float x bounds.min.bounds.size.slicesPerAxis * (0.5f ix);
                        
float y bounds.min.bounds.size.slicesPerAxis * (0.5f iy);
                        
float z bounds.min.bounds.size.slicesPerAxis * (0.5f iz);

                        var 
transform.InverseTransformPoint(new Vector3(xyz));

                        if (
PointIsInsideMeshCollider(meshColp))
                        {
                            
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 0ix slicesPerAxisix++)
            {
                for (
int iy 0iy slicesPerAxisiy++)
                {
                    for (
int iz 0iz slicesPerAxisiz++)
                    {
                        
float x bounds.min.bounds.size.slicesPerAxis * (0.5f ix);
                        
float y bounds.min.bounds.size.slicesPerAxis * (0.5f iy);
                        
float z bounds.min.bounds.size.slicesPerAxis * (0.5f iz);

                        var 
transform.InverseTransformPoint(new Vector3(xyz));

                        
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 cVector3 p)
    {
        
Vector3[] directions = { Vector3.upVector3.downVector3.leftVector3.rightVector3.forwardVector3.back };

        foreach (var 
ray in directions)
        {
            
RaycastHit hit;
            if (
c.Raycast(new Ray(ray 1000ray), out hit1000f) == 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 firstIndexout int secondIndex)
    {
        
float minDistance float.MaxValuemaxDistance float.MinValue;
        
firstIndex 0;
        
secondIndex 1;

        for (
int i 0< list.Count 1i++)
        {
            for (
int j 1< list.Countj++)
            {
                
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 <= || targetCount 2)
        {
            return;
        }

        while (list.
Count targetCount)
        {
            
int firstsecond;
            
FindClosestPoints(list, out firstout 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 xfloat 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.xwp.z);

            if (
wp.voxelHalfHeight waterLevel)
            {
                
float k = (waterLevel wp.y) / (voxelHalfHeight) + 0.5f;
                if (
1)
                {
                    
1f;
                }
                else if (
0)
                {
                    
0f;
                }

                var 
velocity rigidbody.GetPointVelocity(wp);
                var 
localDampingForce = -velocity DAMPFER rigidbody.mass;
                var 
force localDampingForce Mathf.Sqrt(k) * localArchimedesForce;
                
rigidbody.AddForceAtPosition(forcewp);

                
forces.Add(new[] { wpforce }); // 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(gizmoSizegizmoSizegizmoSize));
        }

        
Gizmos.color Color.cyan;

        foreach (var 
force in forces)
        {
            
Gizmos.DrawCube(force[0], new Vector3(gizmoSizegizmoSizegizmoSize));
            
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, время: 18:25.

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