Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 01.08.2013, 18:53   #1726
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Вопросы от новичка

Guiskin зачем придуман? Там есть размеры, настраиваешь и оляля - все норм, что бы случайно программно не сбить - флажок зафиксировать.
*/кто-нибудь кроме меня его юзает?
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 01.08.2013, 20:17   #1727
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

RegIon, как раз задавать фиксированные размеры я не хочу. Да и GUISkin для редактора из-за одного поля делать не хочется.
(Offline)
 
Ответить с цитированием
Старый 02.08.2013, 00:09   #1728
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы от новичка

Задай фиксированный размер первой колонке и не парься
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 02.08.2013, 01:26   #1729
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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);
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 02.08.2013, 17:25   #1731
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 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
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

Кто-нибудь делал, чтобы персонаж мог плавать?
Во первых нужно сделать, чтобы персонаж при всплытии не просто останавливался на уровне воды, а немного выпрыгивал из нее и еще немного колебался на воде.
Во вторых нужно сделать, чтобы когда персонаж просто плыл по воде, то тоже колебался на воде.
Чет как не делаю - все не нравится.
(Offline)
 
Ответить с цитированием
Старый 05.08.2013, 21:21   #1733
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Ответ: Вопросы от новичка

Сообщение от WISHMASTER35 Посмотреть сообщение
Во первых нужно сделать, чтобы персонаж при всплытии не просто останавливался на уровне воды, а немного выпрыгивал из нее и еще
Может я не шарю, но нельзя это сделать на уровне анимации, а не программно? Сделать анимацию с выпрыгиванием, и проигрывать её при достижении уровня воды.
(Offline)
 
Ответить с цитированием
Старый 05.08.2013, 22:23   #1734
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений
(для 880 пользователей)
Ответ: Вопросы от новичка

Смотрел?
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
(Offline)
 
Ответить с цитированием
Старый 05.08.2013, 23:23   #1735
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

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

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

Кстати, лучше сделать затухание скорости? Если просто умножать на 0.95, то большая скорость уменьшается медленно, а маленькая скорость так и не доходит до нуля.
(Offline)
 
Ответить с цитированием
Старый 06.08.2013, 01:03   #1736
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Ответ: Вопросы от новичка

На протяжении, допустим, десяти секунд, отнимаешь от скорости одну десятую её изначального значения. Например, если скорость 50 - то за 10 секунд уменьшаешь её до нуля по 5 в секунду; если скорость 162 - то за 10 секунд уменьшаешь её по 16.2 в секунду. Длительность тоже можно брать из скорости.
(Offline)
 
Ответить с цитированием
Старый 06.08.2013, 05:24   #1737
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 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<
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 , не помню какая переменная.

Думаю силы к фИЗ телам прилагать умеешь .
Для колебаний - делай псевдослучайные толчки ввверх или вниз, ну или волны, на уровне меша и колайдера
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
WISHMASTER35 (07.08.2013)
Старый 11.08.2013, 11:40   #1738
Morganolla
Бывалый
 
Аватар для Morganolla
 
Регистрация: 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
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Вопросы от новичка

Подавляющее большинство платных плагинов написано на шарпе. Для них не нужна ПРО. Плагины про которые говорится по ссылке, и которые только для ПРО написаны на нативном языке (C++ и подобные).
Скорее всего и PRIME написан на шарпе. Следовательно для его использования не нужно ПРО, если там, конечно, не используются другие фишки ПРО.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Morganolla (11.08.2013)
Старый 11.08.2013, 11:56   #1740
Morganolla
Бывалый
 
Аватар для Morganolla
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com