Unity 3D скрипты
Основная информация
Скрипты по Unity 3d движку
Посты перейти
Стена группы
ARTZINE Арт Di 1 год назад #
Коллайдеры (Colliders)
Компоненты коллайдера определяют форму объекта для физических столкновений. Невидимый коллайдер не обязательно должен иметь ту же форму, что и сетка объекта, и на самом деле грубое приближение часто более эффективно и неразличимо в игровом процессе.
Самые простые (и наименее ресурсоемкие) коллайдеры — это так называемые типы примитивных коллайдеров. В 3D это Box Collider, Sphere Collider и Capsule Collider. В 2D можно использовать Box Collider 2D и Circle Collider 2D. Любое их количество может быть добавлено к одному объекту для создания составных коллайдеров .
При тщательном позиционировании и изменении размера составные коллайдеры часто могут довольно хорошо аппроксимировать форму объекта, сохраняя при этом низкую нагрузку на процессор. Дополнительную гибкость можно получить за счет дополнительных коллайдеров на дочерних объектах (например, прямоугольники можно поворачивать относительно локальных осей родительского объекта). При создании такого составного коллайдера должен быть только один компонент Rigidbody, размещенный на корневом объекте в иерархии.
Обратите внимание, что примитивные коллайдеры не будут корректно работать с сдвиговыми преобразованиями — это означает, что если вы используете комбинацию поворотов и неравномерных масштабов в иерархии преобразований, чтобы результирующая форма больше не соответствовала примитивной форме, примитивный коллайдер не будет уметь правильно представлять.
Однако бывают случаи, когда даже составные коллайдеры недостаточно точны. В 3D вы можете использовать коллайдеры сетки, чтобы точно соответствовать форме сетки объекта. В 2D Polygon Collider 2D, как правило, не будет идеально соответствовать форме спрайта, но вы можете уточнить форму до любого уровня детализации, который вам нравится. Однако эти коллайдеры гораздо более требовательны к процессору, чем примитивные типы, поэтому используйте их экономно, чтобы поддерживать хорошую производительность. Кроме того, меш-коллайдер обычно не может столкнуться с другим меш-коллайдером (т. е. ничего не произойдет, когда они вступят в контакт). В некоторых случаях вы можете обойти это, пометив коллайдер сетки как Convex.в инспекторе. Это создаст форму коллайдера в виде «выпуклой оболочки», которая похожа на исходную сетку, но с заполненными поднутрениями. Преимущество этого заключается в том, что коллайдер выпуклой сетки может сталкиваться с другими коллайдерами сетки, поэтому вы можете использовать эту функцию. когда у вас есть подвижный персонаж с подходящей формой. Однако хорошим общим правилом является использование коллайдеров сетки для геометрии сцены и аппроксимация формы движущихся объектов с помощью составных примитивных коллайдеров.
Коллайдеры могут быть добавлены к объекту без компонента Rigidbody для создания полов, стен и других неподвижных элементов сцены. Их называют статическими коллайдерами. Как правило, вы не должны перемещать статические коллайдеры, изменяя положение Transform, так как это сильно повлияет на производительность физического движка. Коллайдеры на объекте, у которого есть Rigidbody, называются динамическими коллайдерами. Статические коллайдеры могут взаимодействовать с динамическими коллайдерами, но, поскольку у них нет Rigidbody, они не будут двигаться в ответ на столкновения.
Страницы справки для различных типов коллайдеров, указанных выше, имеют дополнительную информацию об их свойствах и способах использования.
Физические материалы (Physics Materials)
Когда коллайдеры взаимодействуют, их поверхности должны имитировать свойства материала, который они должны представлять. Например, лист льда будет скользким, в то время как резиновый мяч будет создавать сильное трение и будет очень упругим. Хотя форма коллайдеров не деформируется при столкновениях, их трение и отскок можно настроить с помощью Physics Materials. Получение правильных параметров может потребовать проб и ошибок, но, например, ледяной материал будет иметь нулевое (или очень низкое) трение, а резиновый материал будет иметь высокое трение и почти идеальную упругость. См. справочные страницы для Физического материала и Физического материала 2D.для получения дополнительной информации о доступных параметрах. Обратите внимание, что по историческим причинам 3D-ресурс на самом деле называется Физический материал ( без буквы S), а 2D-эквивалент называется Физический материал 2D ( с буквой S).
Триггеры (Triggers)
Система сценариев может определять, когда происходят
ARTZINE Арт Di 1 год назад #
var soundFire: AudioClip;
var soundReload: AudioClip;
var range = 100.0;
var fireRate = 0.05;
var force = 10.0;
var damage = 5.0;
var bulletsPerClip = 30;
var clips = 20;
var waitTime = 0.5;
var reloadTime = 2.6;
private var hitParticles: ParticleEmitter;
var muzzleFlash: Renderer;
private var bulletsLeft: int = 0;
private var nextFireTime = 0.0;
private var m_LastFrameShot = -1;
function Start () {
hitParticles = GetComponentInChildren(ParticleEmitter);
// We don't want to emit particles all the time, only when we hit something.
if (hitParticles)
hitParticles.emit = false;
bulletsLeft = bulletsPerClip;
}
function LateUpdate() {
audio.clip = soundFire;
if (muzzleFlash) {
// We shot this frame, enable the muzzle flash
if (m_LastFrameShot == Time.frameCount) {
animation.CrossFade(«fire»);
audio.clip = soundFire;
audio.Play();
muzzleFlash.transform.localRotation = Quaternion.AngleAxis(Random.value * 360, Vector3.forward);
muzzleFlash.enabled = true;
} else {
// We didn't, disable the muzzle flash
animation.CrossFade(«idle»);
muzzleFlash.enabled = false;
enabled = false;
}
}
}
function Fire () {
if (bulletsLeft == 0)
return;
// If there is more than one bullet between the last and this frame
// Reset the nextFireTime
if (Time.time — fireRate > nextFireTime)
nextFireTime = Time.time — Time.deltaTime;
// Keep firing until we used up the fire time
while( nextFireTime < Time.time && bulletsLeft != 0) {
FireOneShot();
nextFireTime += fireRate;
}
}
function FireOneShot () {
var direction = transform.TransformDirection(Vector3.forward);
var hit: RaycastHit;
// Did we hit anything?
if (Physics.Raycast (transform.position, direction, hit, range)) {
// Apply a force to the rigidbody we hit
if (hit.rigidbody)
hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
// Place the particle system for spawing out of place where we hit the surface!
// And spawn a couple of particles
if (hitParticles) {
hitParticles.transform.position = hit.point;
hitParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
hitParticles.Emit();
}
// Send a damage message to the hit object
hit.collider.SendMessageUpwards(«ApplyDamage», damage, SendMessageOptions.DontRequireReceiver);
}
bulletsLeft--;
// Register that we shot this frame,
// so that the LateUpdate function enabled the muzzleflash renderer for one frame
m_LastFrameShot = Time.frameCount;
enabled = true;
// Reload gun in reload Time
if (Input.GetButton («reload»))
Reload();
if (bulletsLeft == 0)
Reload();
}
function Reload () {
// Wait for reload time first — then add more bullets!
yield WaitForSeconds(waitTime);
animation.CrossFade(«reload»);
yield WaitForSeconds(waitTime);
audio.clip = soundReload;
audio.Play();
yield WaitForSeconds(reloadTime);
animation.CrossFade(«idle»);
// We have a clip left reload
if (clips > 0) {
clips--;
bulletsLeft = bulletsPerClip;
}
}
function GetBulletsLeft () {
return bulletsLeft;
}
ARTZINE Арт Di 1 год назад #
var speed = 10.0;
var jumpSpeed = 8.0;
var gravity = 20.0;
var runSpeed = 2.0;
var sitSpeed = 0.3;
private var moveDirection = Vector3.zero;
private var grounded: boolean = false;
function FixedUpdate() {
if (grounded) {
// We are grounded, so recalculate movedirection directly from axes
moveDirection = new Vector3(Input.GetAxis(«Horizontal»), 0, Input.GetAxis(«Vertical»));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton («Jump»)) {
moveDirection.y = jumpSpeed;
transform.localScale.y = 1;
}
if (Input.GetButton («run»)) {
moveDirection *= runSpeed;
transform.localPosition.y = 2.1;
transform.localScale.y = 1;
}
if (Input.GetButton («sit»)) {
transform.localScale.y = 0.5;
moveDirection *= sitSpeed;
}
}
// Apply gravity
moveDirection.y -= gravity * Time.deltaTime;
// Move the controller
var controller: CharacterController = GetComponent(CharacterController);
var flags = controller.Move(moveDirection * Time.deltaTime);
grounded = (flags & CollisionFlags.CollidedBelow) != 0;
}
@script RequireComponent(CharacterController)
ARTZINE Арт Di 1 год назад #
Здесь все аналогично transform.position. Кроме одного, несмотря на то, что в редакторе Unity3D Rotation представляет собой Vector3, то есть вращение относительно оси X, оси Y, оси Z. Но в коде оно представлено в виде кватернионов.
ARTZINE Арт Di 1 год назад #
Вращение объекта
За вращение объекта отвечает компонент transform.rotation, transform.localRotation и функция transform.Rotate.
ARTZINE Арт Di 1 год назад #
int speed = 5;
void Start()
transform.position += new Vector3(speed,0,0)*Time.deltaTime;//движение по оси х с заданием параметра(скорости) через переменную speed
transform.position += new Vector3(1,0,1)*speed*Time.deltaTime;// движение по заданным осям со скоростью установленной переменной speed