上海虹口龙之梦项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

161 lines
5.5 KiB

using System.Collections;
using UnityEngine;
using UnityEngine.Animations;
[RequireComponent(typeof(ThirdPersonCharacter))]
public class FiremanControl : MonoBehaviour
{
private ThirdPersonCharacter m_Character; //ThirdPersonCharacter的对象的引用
private Vector3 m_CamForward; //当前相机的正前方
public Transform ThirdPersonCamera;//主摄像机的位置
private Vector3 m_Move;//根据相机的正前方和用户的输入,计算世界坐标相关的移动方向
private bool m_Jump;
private Animator animator;
public bool driving;
public bool _getInCar;
public GameObject currCar;
public GameObject carCamPoint;
public CapsuleCollider capsuleCollider;
private Vector3 InitialPosition;
private ConstraintSource source;
private void Start()
{
m_Character = GetComponent<ThirdPersonCharacter>();
animator = GetComponent<Animator>();
capsuleCollider = GetComponent<CapsuleCollider>();
InitialPosition = transform.position;
}
private void Update()
{
if (!m_Jump)
{
m_Jump = Input.GetButtonDown("Jump");
}
var ahead = this.transform.forward;
var rayStart = new Vector3(this.transform.position.x, this.transform.position.y + 1f, this.transform.position.z);
var ray = new Ray(rayStart, ahead);
if (Physics.Raycast(ray, out RaycastHit hit, 0.7f))
{
Debug.DrawLine(ray.origin, hit.point);
{
if (hit.transform.gameObject.CompareTag(("Car")) && driving == false)
{
currCar = hit.transform.gameObject;
if (currCar != null && !driving)
{
if (Input.GetKeyDown(KeyCode.E))
{
_getInCar = true;
StartCoroutine(GetInCar());
}
}
}
}
}
if (driving)
{
if (Input.GetKeyDown(KeyCode.E))
{
driving = false;
_getInCar = false;
StartCoroutine(GetOutCar());
}
}
else
{
if (Input.GetKeyDown(KeyCode.R)) ResetplayerPosition();
}
}
// Fixed update is called in sync with physics
private void FixedUpdate()
{
animator.SetBool("GetInCar", _getInCar);
if (!driving)
{
// read inputs
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
m_Character.Input.x = h;
m_Character.Input.z = v;
bool crouch = Input.GetKey(KeyCode.C);
if (ThirdPersonCamera != null)
{
m_CamForward = Vector3.Scale(ThirdPersonCamera.forward, new Vector3(1, 0, 1)).normalized;
m_Move = v * m_CamForward + h * ThirdPersonCamera.right;
}
else
{
m_Move = v * Vector3.forward + h * Vector3.right;
}
// walk speed multiplier
if (Input.GetKey(KeyCode.LeftShift)) m_Move *= 0.5f;
// pass all parameters to the character control script
m_Character.Move(m_Move , crouch, m_Jump);
m_Jump = false;
}
}
/// <summary>
/// 上车
/// </summary>
/// <returns></returns>
private IEnumerator GetInCar()
{
capsuleCollider.enabled = false;
this.GetComponent<ParentConstraint>().constraintActive = true;
GetComponent<Rigidbody>().useGravity = false;
GameObject sitPoint = currCar.transform.Find("sitPoint").gameObject;
carCamPoint = currCar.transform.Find("carCamPoint").gameObject;
currCar.GetComponent<CarControl>().openDoor = true;
source.sourceTransform = sitPoint.transform;
source.weight = 1.0f;
GetComponent<ParentConstraint>().SetSource(0, source);
yield return new WaitForSeconds(2.5f);
driving = true;
Camera.main.GetComponent<ThirdPersonCamera>()._wanted_distance = 15f;
currCar.GetComponent<CarControl>().openDoor = false;
Transform Seat = currCar.transform.Find("seat");
Camera.main.GetComponent<ThirdPersonCamera>().target = Seat;
source.sourceTransform = Seat.transform;
source.weight = 1.0f;
GetComponent<ParentConstraint>().SetSource(0, source);
}
/// <summary>
/// 下车
/// </summary>
/// <returns></returns>
private IEnumerator GetOutCar()
{
currCar.GetComponent<CarControl>().engineStopped = true;
currCar.GetComponent<CarControl>().openDoor = true;
yield return new WaitForSeconds(2.0f);
Camera.main.GetComponent<ThirdPersonCamera>()._wanted_distance = 3f;
GetComponent<ParentConstraint>().constraintActive = false;
GameObject sitPoint = currCar.transform.Find("sitPoint").gameObject;
capsuleCollider.enabled = true;
this.transform.position = sitPoint.transform.position;
this.transform.rotation = sitPoint.transform.rotation;
currCar.GetComponent<CarControl>().openDoor = false;
GetComponent<Rigidbody>().useGravity = true;
Camera.main.GetComponent<ThirdPersonCamera>().target = this.transform;
}
/// <summary>
/// 消防员重置位置
/// </summary>
void ResetplayerPosition()
{
this.transform.localPosition = InitialPosition;
this.transform.localEulerAngles = new Vector3(0, this.transform.eulerAngles.y, 0);
}
}