Unity 不会在任何组件和任何项目中运行我的 c# 脚本。它虽然读取所有值
Posted
技术标签:
【中文标题】Unity 不会在任何组件和任何项目中运行我的 c# 脚本。它虽然读取所有值【英文标题】:Unity doesn't run my c# scripts in any component and in any project. It reads all the values though 【发布时间】:2018-03-12 10:56:10 【问题描述】:我是统一的新手,我正在处理一个问题。 Unity 不会在任何组件和任何项目中运行我的 c# 脚本。尽管 unity 从脚本中读取所有值,但它不会按预期执行游戏。在脚本组件上,它显示脚本已禁用,如以下屏幕截图所示。我可能应该提到游戏运行良好,直到这个问题不知从何而来。我不认为这是脚本的问题,因为即使在完全空的脚本上也会发生这种情况。 This is the script componentEmpty c# script with the same problem。我曾尝试重新安装 unity 2 次(没有任何反应)。我试图重新导入所有脚本(没有任何反应)。我试图重新导入所有资产(没有任何反应)。任何帮助将非常感激。 This is the whole scene
这是整个脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Boundary
public float xMin, xMax, zMin, zMax;
public class PlayerController : MonoBehaviour
public float speed;
public float tilt;
public Boundary boundary;
private Rigidbody rb;
void Start()
rb = GetComponent<Rigidbody>();
public GameObject shot;
public Transform shotSpawn;
public float fireRate;
private float nextFire;
void Update()
if (Input.GetButton("Fire1") && Time.time > nextFire)
nextFire = Time.time + fireRate;
Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
GetComponent<Audiosource>().Play();
private void FixedUpdate()
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.velocity = movement * speed;
rb.position = new Vector3
(
Mathf.Clamp(rb.position.x, boundary.xMin, boundary.xMax),
0.0f,
Mathf.Clamp(rb.position.z, boundary.zMin, boundary.zMax)
);
rb.rotation = Quaternion.Euler(0.0f, 0.0f, rb.velocity.x * -tilt);
This is the screenshot
【问题讨论】:
我们可以看看你的脚本吗? 脚本实际上并没有被禁用,在这种情况下,勾号不会出现。你能把你的场景截图分享给选择了脚本的游戏对象吗?还有整个脚本? 请看下面 好的,已经做到了:) 糟糕,我们丢失了场景屏幕截图的链接。您可以在此处添加评论。关于您的问题,您确定编辑器中的控制台绝对没有错误吗? 【参考方案1】:首先 - 脚本嵌入了输入管理器(项目设置/输入)有一个名为“Fire1”的轴的假设。虽然默认情况下这是正确的,但我已经看到它发生了变化(通常通过 3rd 方脚本),所以请验证您的项目中是否有该轴。您可以尝试创建一个新项目并将您的脚本放在那里。
其次,我不确定你是否对刚体做正确的事情,你似乎是手动改变它的位置,所以你有效地覆盖了你之前要求的任何计算(通过设置速度),你应该选择一种方法并坚持下去,即在刚体上勾选“isKinematic”并手动控制其位置,或者只信任 PhysiX 并修改速度(对我来说更有意义)。在很多情况下,混合方法会产生一些意想不到的结果,在这种情况下它会起作用,但并不完全符合预期
【讨论】:
【参考方案2】:我不确定您的代码到底有什么问题,但如果问题出在您的 FixedUpdateMethod 上,那是因为您更改了该方法的访问级别。
This is a link explaining the why you can't change access levels when overriding a method.
Unity 的 API 在默认访问级别具有 FixedUpdate()
,因此请尝试将其更改为私有。
应该是这样的:
public class PlayerController : MonoBehaviour
public float speed;
public float tilt;
public Boundary boundary;
private Rigidbody rb;
void Start()
rb = GetComponent<Rigidbody>();
public GameObject shot;
public Transform shotSpawn;
public float fireRate;
private float nextFire;
void Update()
if (Input.GetButton("Fire1") && Time.time > nextFire)
nextFire = Time.time + fireRate;
Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
GetComponent<AudioSource>().Play();
void FixedUpdate() //no longer has private keyword appended to method
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.velocity = movement * speed;
rb.position = new Vector3
(
Mathf.Clamp(rb.position.x, boundary.xMin, boundary.xMax),
0.0f,
Mathf.Clamp(rb.position.z, boundary.zMin, boundary.zMax)
);
rb.rotation = Quaternion.Euler(0.0f, 0.0f, rb.velocity.x * -tilt);
【讨论】:
【参考方案3】:遇到同样的问题,花了一段时间才找到解决方案 您可能会在统一调试控制台中暂停错误,如果有任何错误,它会暂停脚本的执行,这里有一个标签为“错误暂停”的选项卡。如果它被突出显示,请单击它以禁用它
【讨论】:
以上是关于Unity 不会在任何组件和任何项目中运行我的 c# 脚本。它虽然读取所有值的主要内容,如果未能解决你的问题,请参考以下文章
带有 Unity 的 Google Play 服务 - 登录没有任何结果