Всем привет. Я закончил скрипт для игры над которым я работал и всем отвечающим (кроме
freeExec) спасибо за ваши ответы. А теперь к самому скрипту точнее к скриптам.
Чтоб сделать то что я хотел потребовалась 4 скрипта.
Первый скрипт для поворот рук это тот же самый скрипт который я спросил как его изменить.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MouseLook : MonoBehaviour
{
public float offset;
void Update()
{
Vector3 diference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
float rotateZ = Mathf.Atan2(diference.y, diference.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, 0f, rotateZ + offset);
Vector3 LocalScale = Vector3.one;
if(rotateZ > 90 || rotateZ <-90)
{
LocalScale.y = -1f;
}
else
{
LocalScale.y = +1f;
}
transform.localScale = LocalScale;
}
}
второй для поворачивание персонажа в сторону мыши(то есть на 180 градусов в ту сторону где мышка).
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotatePlayer : MonoBehaviour
{
Vector3 pos;
Camera main;
private void Start()
{
main = FindObjectOfType<Camera>();
}
void Update()
{
Flip();
pos = main.WorldToScreenPoint(transform.position);
}
void Flip()
{
if(Input.mousePosition.x < pos.x)
{
transform.localRotation = Quaternion.Euler(0, 180, 0);
}
if (Input.mousePosition.x > pos.x)
{
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
но есть одно большое НО эти скрипты работают постоянна, а нам нужно чтобы скрипты работали только тогда когда мышь зажата. Для этого существует третий скрипт он активирует эти скрипты когда мышь зажата.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BtnHoldDetect : MonoBehaviour
{
private MouseLook look;
private GameObject Ruki;
void Start()
{
GameObject ruki = GameObject.Find("Ruki");
MouseLook look = ruki.GetComponent<MouseLook>();
look.enabled = false;
GameObject player = GameObject.Find("Player");
RotatePlayer look2 = player.GetComponent<RotatePlayer>();
look2.enabled = false;
}
void Update() {
if (Input.GetMouseButtonDown(0)) {
GameObject ruki = GameObject.Find("Ruki");
MouseLook look = ruki.GetComponent<MouseLook>();
look.enabled = true;
GameObject player = GameObject.Find("Player");
RotatePlayer look2 = player.GetComponent<RotatePlayer>();
look2.enabled = true;
}
if (Input.GetMouseButtonUp(0))
{
GameObject ruki = GameObject.Find("Ruki");
MouseLook look = ruki.GetComponent<MouseLook>();
look.enabled = false;
GameObject player = GameObject.Find("Player");
RotatePlayer look2 = player.GetComponent<RotatePlayer>();
look2.enabled = false;
}
}
}
Четвёртый скрипт для возращения рук к исходному положению. А если быть точнее когда руки находится в промежутке z>270 z<90 то руки поворачиваются к точке z=0, а если z<270 z>90 то они поворачиваются к точке z=180.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotation_Swap : MonoBehaviour
{
float smooth= 5.0f;
float toAngle1 = 0.0f;
float toAngle2 = 180.0f;
void Start()
{
}
// Update is called once per frame
void Update()
{
Vector3 LocalScale = Vector3.one;
if ( (transform.eulerAngles.z > 270) ||(transform.eulerAngles.z < 90))
{
Quaternion target = Quaternion.Euler(0, 0, toAngle1);
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
LocalScale.y = +1f;
}
else if ((transform.eulerAngles.z > 90)||(transform.eulerAngles.z < 270))
{
Quaternion target = Quaternion.Euler(0, 0, toAngle2);
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
LocalScale.y = -1f;
}
transform.localScale = LocalScale;
}
}