Roman d6b89f7b89 任务:搭建第二关的框架
场景【第二关】
*反向的事情先搁置,因为场景图片素材还没有替换
1.给巡逻敌人添上耳朵,实其能够监测到进入听觉范围内的物体。
2.使巡逻敌人能够分辨出投掷物,并记录听觉范围内的每一个投掷物。

周末有点摸鱼,我明天一定把第二关的游戏系统全部开完完。
加油吧,加油了吗?
2021-08-23 01:55:03 +08:00

138 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Patrolman : MonoBehaviour
{
//控制巡逻敌人
[Tooltip("拖入巡逻点1")]
public Transform point1;
[Tooltip("拖入巡逻点2他将于此两点间往返")]
public Transform point2;
[Tooltip("普通移动时的速度")]
public float walkSpeed;
[Tooltip("听见响动,冲锋时的速度")]
public float rushSpeed;
private float speed;//记录此刻瞬间的速度,不包含方向
private float velocity;//速度,正值代表向右,用来判断面部朝向
private Transform target;//当前目标位置
private bool isInterrupt = false;//记录目前是否被石头落地的声音所吸引
private float PVelocity = -1f;//记录上一帧的速度,默认上一帧往右走
private Transform auditoryRange;//听觉范围子物体
[SerializeField][ReadOnly]
private List<Missile> missiles;//投掷物列表,巡逻者会自动往搜索听觉范围内的投掷物
// Start is called before the first frame update
void Start()
{
target = point1;//初始化起始目标为巡逻点1
speed = walkSpeed;//初始化瞬间速度为走路速度
auditoryRange = transform.Find("听觉范围");//找到子物体听觉范围
auditoryRange.gameObject.AddComponent<AuditoryRange>();//给子物体听觉范围填上碰撞监测代码
missiles = new List<Missile>();//初始化投掷物列表
}
// Update is called once per frame
void Update()
{
Move();//每帧朝目标移动
}
//朝目标移动函数
private void Move()
{
//构造速度向量
velocity = (target.position - transform.position).x;
velocity = Mathf.Abs(velocity)/velocity;//把速度标准化为1或者-1只保留方向
velocity *= speed;//给速度赋以大小
//判断是否到达巡逻点
if(velocity*PVelocity < 0 && !isInterrupt)//速度相乘得负数,说明方向发生改变
{
//如果计算速度发生改变,且不是因为被石头打断,说明经过了巡逻点,此时更换目标点为另一个
if(target.Equals(point1)) target = point2;
else target = point1;
}
//控制面部朝向
if(velocity > 0) transform.rotation = Quaternion.Euler(0,0,0);
else transform.rotation = Quaternion.Euler(0,180f,0);
//移动
transform.position = new Vector3(
//x
transform.position.x +//自身此刻位置 加上
velocity * //构造好的速度乘以
Time.deltaTime,//使其与时间无关
//y和z不变
transform.position.y,
transform.position.z
);
//更新PVelocity
PVelocity = velocity;
}
void OnTriggerEnter2D(Collider2D other)
{
if(other.gameObject.tag == "Player") Debug.Log("玩家进入了监测区");
}
//在听觉范围中调用,加入一个监听中的投掷物
public void AddAMissile(Missile missile){missiles.Add(missile);}
//在听觉范围中调用,移除一个监听中的投掷物
public void RemoveAMissile(Missile missile){missiles.Remove(missile);}
// for(int i = 0; i < missiles.Count; i++)
// {
// if(missiles[i].Equals(missile))
// {
// missiles.Remove(missile);
// }
// }
private class AuditoryRange : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
if(other.tag == "投掷物")
{
//当有投掷物进入听觉范围,把他加入监控内的投掷物列表
GetComponentInParent<Patrolman>().AddAMissile(other.GetComponent<Missile>());
}
}
void OnTriggerExit2D(Collider2D other)
{
if(other.tag == "投掷物")
{
//当有投掷物离开听觉范围,把他移出监控内的投掷物列表
GetComponentInParent<Patrolman>().RemoveAMissile(other.GetComponent<Missile>());
}
}
}
//制造一个只读的变量,不要动这些
public class ReadOnlyAttribute : PropertyAttribute{}
[CustomPropertyDrawer(typeof(ReadOnlyAttribute))]
public class ReadOnlyDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, label, true);
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GUI.enabled = false;
EditorGUI.PropertyField(position, property, label, true);
GUI.enabled = true;
}
}
//
}