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

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

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

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

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

делал когда-то сглаживание движения мыши так: есть массив размером 60 элементов, в апдейт удаляю первый элемент, сдвигаю все элементы и в конец записываю дельту мыши. а потом из этого массива нахожу среднюю дельту мыши.
как бы все хорошо, но при разных фпс по разному работает. как можно сделать, чтобы при разных фпс оно одинаково работало?
а еще лучше сглаживать движение и вращение самой камеры. только как найти средний угол из нескольких я не пойму. во всяком случае я замечаю как в играх камера от третьего лица не жество привязана к персонажу.
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 00:25   #572
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы от новичка

имхо мышь никто не сглаживает, самый простой способ - вращать и перемещать вспомогательный объект вместо камеры, а камеру стремить к ориентации и положению этого объекта. Потом просто две строчки:

transform.position Vector3.Lerp(transform.positiontargetTransform.positionpositionSpeed Time.deltatime);
transform.rotationQuaternion.Slerp(transform.rotationtargetTransform.rotationrotationSpeed Time.deltatime); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 13:11   #573
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
Ответ: Вопросы от новичка

Как проверить входит ли объект в камеру или нет? И если возможно еще добавить условие от краев камеры до объекта расстояние должно быть больше 3.
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 13:54   #574
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы от новичка

вхождение объекта в камеру можно проверить посчитав ее плейны камеры
http://docs.unity3d.com/Documentatio...tumPlanes.html
и протестировав габариты объекта с помощью них
http://docs.unity3d.com/Documentatio...lanesAABB.html
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 09.08.2012, 22:32   #575
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

камере от первого лица легко получилось сделать такое сглаживание. дополнительный обьект там совсем не нужен.
а вот камера от третьего лица начинает дрожать т.к. при интерполяции она сбивается с цели.
можно интерполировать не финкльную трансформацию камеры, а ее углы вокруг цели(angles в MouseOrbit), а вот при интерполяции позии цели почему-то снова дрожания появляются, а хотелось бы и сглаженное движение сделать.
(Offline)
 
Ответить с цитированием
Старый 10.08.2012, 14:37   #576
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы от новичка

А пример показать как ты делаешь?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 10.08.2012, 15:17   #577
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

 using UnityEngine;
using System.Collections;

public class CameraOrbit : MonoBehaviour {
	
	public Transform target;
	public Vector3 targetOffset = new Vector3(0, 1.5f, 0);
	private Vector3 oldTargetPosition;
	
	public float minAngleX = -20, maxAngleX = 60;
	private Vector3 angles;
	
	private const float minDistance = 1.0f;
	private float distance;
	public float maxDistance = 7.0f;
	
	public Vector3 cameraOffset = new Vector3(1, 0, 0);
	
	void OnEnable() {
		if( !target ) return;
		angles = transform.eulerAngles;
		distance = maxDistance;
	}
	
	void LateUpdate () {
		if( !target ) return;
		
		angles += GetInputRotation();
		angles.x = ClampAngle(angles.x, minAngleX, maxAngleX);
		
		Vector3 targetPosition = target.TransformPoint(targetOffset);
		// попытка сгладить движение камеры
		//targetPosition = Vector3.Lerp(oldTargetPosition, targetPosition, 15*Time.deltaTime);
		//oldTargetPosition = targetPosition;
		
		// сглаживаем вращение камеры
		Quaternion rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(angles), 20*Time.deltaTime);
		ComputeTransform(targetPosition, rotation, maxDistance, cameraOffset);
		distance = CollisionTest(targetPosition, distance);
	}
	
	private void ComputeTransform(Vector3 targetPosition, Quaternion rotation, float distance, Vector3 cameraOffset) {
		transform.rotation = rotation;
		transform.position = targetPosition;
		transform.Translate(0, 0, -distance);
		transform.Translate(cameraOffset * distance);
	}
	
	private float CollisionTest(Vector3 targetPosition, float oldDistance) {
		Vector3 dir = transform.position - targetPosition;
		float distance = Raycast(targetPosition, dir, dir.magnitude);
		if(distance < 1) distance = 1;
		distance = Mathf.Lerp(oldDistance, distance, 10*Time.deltaTime);
		transform.position = targetPosition + dir.normalized * distance;
		return distance;
	}
	
	private static float Raycast(Vector3 start, Vector3 dir, float distance) {
		RaycastHit hit = new RaycastHit();
		if( Physics.Raycast(start, dir, out hit, distance) ) {
			return hit.distance;
		}
		return distance;
	}
	
	private static float ClampAngle(float angle, float min, float max) {
		if (angle < -360) angle += 360;
		if (angle > 360) angle -= 360;
		return Mathf.Clamp (angle, min, max);
	}
	
	private Vector3 GetInputRotation() {
		#if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
		return MobileInput.GetRotation();
		#else
		if( !Input.GetMouseButton(1) ) return Vector2.zero; 
		float dx = Input.GetAxis( "Mouse X" )*4;
		float dy = Input.GetAxis( "Mouse Y" )*4;
		return new Vector2(-dy, dx);
		#endif
	}
	
	void OnDrawGizmosSelected() {
		if(!enabled) return;
		
		Gizmos.color = Color.red;
		Gizmos.DrawSphere( target.TransformPoint( targetOffset ), 0.05f );
	}
	
}
(Offline)
 
Ответить с цитированием
Старый 10.08.2012, 15:23   #578
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы от новичка

А что если
// попытка сгладить движение камеры
targetPosition Vector3.Lerp(oldTargetPositiontargetPosition15*Time.deltaTime);
 if((
targetPosition-oldTargetPosition ).magnitude <0.001f)
{
  
targetPosition oldTargetPosition ;
}
else
{
   
oldTargetPosition targetPosition;

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 10.08.2012, 21:55   #579
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

так же. в любом случае эоо,не решение, а затычка) а тебе не приходилось писать игры от третьего лица?
еще такой вопрос чешится) если я в апдейт активирую какой-то обьект, то можно после его отрисовки отключить без лишних переменных? т.е. перед апдейтом или после рендеринга каждый кадр отключать его?
пока у меня есть дополнительная переменная отвечающая за его состояние. и в LateUpdate я делаю
if !active then go.active = false;
active = false.
часто что-то надо включить на один кадр, а в следующем выключить. кумарит на такую мелочь тратить больше двух строк когда) может есть лучше способ решить это.
(Offline)
 
Ответить с цитированием
Старый 10.08.2012, 23:34   #580
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы от новичка

Что-то мне не заметно как она дрыгается... попробуй так:
// попытка сгладить движение камеры
        
targetPosition Vector3.MoveTowards(oldTargetPositiontargetPosition15*Time.deltaTime);
        
oldTargetPosition targetPosition
А еще есть вот такая штука: Vector3.SmoothDamp

на счет остановки - есть возможность запустить корутину, которая дождется конца кадра и сделает дело - http://docs.unity3d.com/Documentatio...ndOfFrame.html.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 10.08.2012, 23:59   #581
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

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

проблема была в том что цель двигалась в фиксед апдейт, а камера сглажывашась в кпдейт)
теперь надо как то сглаживать движение камеры после фиксед апдейт. наверна свой цикл с корутиной в цикле надо делать. может есть лучше варианты?
update: лучше просто в фиксед апдейт это делать. конечно гарантии нет, что выполнятся будет именно после фиксед апдейта цели, но это и не надо)

Последний раз редактировалось WISHMASTER35, 12.08.2012 в 19:51.
(Offline)
 
Ответить с цитированием
Старый 15.08.2012, 18:17   #583
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

есть твердое тело в лифте, лифт анимируется анимацией. можно сделать чтобы это тело не прыгало, когда лифт опускается?
(Offline)
 
Ответить с цитированием
Старый 15.08.2012, 20:38   #584
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы от новичка

попробовать в LateUpdate смещать объект на величину смещения лифта с прошлого кадра?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 15.08.2012, 22:14   #585
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Вопросы от новичка

вручную смещать то просто)
да и не очень хорошо смещать rigid body вручную.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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